3dnow_xform1.S revision 1b2fef5c28a40cd001598071e25b876ad4fccdd1
1bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* $Id: 3dnow_xform1.S,v 1.1 2001/03/29 06:46:16 gareth Exp $ */ 2bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 3bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* 4bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Mesa 3-D graphics library 5bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Version: 3.5 6bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * 7bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 8bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * 9bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Permission is hereby granted, free of charge, to any person obtaining a 10bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * copy of this software and associated documentation files (the "Software"), 11bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to deal in the Software without restriction, including without limitation 12bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and/or sell copies of the Software, and to permit persons to whom the 14bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Software is furnished to do so, subject to the following conditions: 15bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * 16bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The above copyright notice and this permission notice shall be included 17bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * in all copies or substantial portions of the Software. 18bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * 19bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */ 26bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 27bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "matypes.h" 28bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "xform_args.h" 29bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 30bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev SEG_TEXT 31bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 32bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define FRAME_OFFSET 4 33bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 34bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 35bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 36bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLOBL GLNAME( _mesa_3dnow_transform_points1_general ) 37bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLNAME( _mesa_3dnow_transform_points1_general ): 38bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 39bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( ESI ) 40bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 41bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_DEST, ECX ) 42bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_MATRIX, ESI ) 43bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_SOURCE, EAX ) 44bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) 45bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) 46bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) 47bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) 48bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 49bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( EDI ) 50bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 51bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(4, ECX), EDX ) 52bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ESI, ECX ) 53bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) 54bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) 55bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_START, EAX), EAX ) 56bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 57bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev TEST_L ( ESI, ESI ) 58bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JZ ( LLBL( G3TPGR_3 ) ) 59bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 60bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ 61bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGOFF(8, ECX), MM1 ) /* m03 | m02 */ 62bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 63bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ 64bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGOFF(56, ECX), MM3 ) /* m33 | m32 */ 65bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 66bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 67bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TPGR_2 ): 68bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 69bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(EAX), MM4 ) /* | x0 */ 70bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ 71bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 72bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM4, MM5 ) /* x0 | x0 */ 73bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ 74bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 75bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFMUL ( MM1, MM5 ) /* x0*m03 | x0*m02 */ 76bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ 77bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 78bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFADD ( MM3, MM5 ) /* x0*m03+m33 | x0*m02+m32 */ 79bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ 80bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 81bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM5, REGOFF(8, EDX) ) /* write r3, r2 */ 82bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( EDI, EAX ) /* next vertex */ 83bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 84bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( CONST(16), EDX ) /* next r */ 85bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev DEC_L ( ESI ) /* decrement vertex counter */ 86bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 87bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JNZ ( LLBL( G3TPGR_2 ) ) /* cnt > 0 ? -> process next vertex */ 88bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 89bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TPGR_3 ): 90bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 91bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev FEMMS 92bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( EDI ) 93bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( ESI ) 94bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev RET 95bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 96bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 97bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 98bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 99bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 100bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLOBL GLNAME( _mesa_3dnow_transform_points1_identity ) 101bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLNAME( _mesa_3dnow_transform_points1_identity ): 102bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 103bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( ESI ) 104bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 105bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_DEST, ECX ) 106bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_MATRIX, ESI ) 107bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_SOURCE, EAX ) 108bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( CONST(1), REGOFF(V4F_SIZE, ECX) ) 109bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev OR_B ( CONST(VEC_SIZE_1), REGOFF(V4F_FLAGS, ECX) ) 110bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) 111bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) 112bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 113bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( EDI ) 114bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 115bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(4, ECX), EDX ) 116bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ESI, ECX ) 117bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) 118bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) 119bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_START, EAX), EAX ) 120bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 121bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev TEST_L ( ESI, ESI ) 122bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JZ ( LLBL( G3TPIR_4) ) 123bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 124bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 125bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TPIR_3 ): 126bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 127bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(EAX), MM0 ) /* | x0 */ 128bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( EDI, EAX ) /* next vertex */ 129bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 130bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( MM0, REGIND(EDX) ) /* | r0 */ 131bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( CONST(16), EDX ) /* next r */ 132bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 133bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev DEC_L ( ESI ) /* decrement vertex counter */ 134bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JNZ ( LLBL( G3TPIR_3 ) ) /* cnt > 0 ? -> process next vertex */ 135bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 136bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TPIR_4 ): 137bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 138bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev FEMMS 139bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( EDI ) 140bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( ESI ) 141bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev RET 142bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 143bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 144bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 145bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 146bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 147bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLOBL GLNAME( _mesa_3dnow_transform_points1_3d_no_rot ) 148bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLNAME( _mesa_3dnow_transform_points1_3d_no_rot ): 149bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 150bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( ESI ) 151bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 152bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_DEST, ECX ) 153bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_MATRIX, ESI ) 154bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_SOURCE, EAX ) 155bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) 156bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) 157bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) 158bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) 159bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 160bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( EDI ) 161bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 162bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(4, ECX), EDX ) 163bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ESI, ECX ) 164bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) 165bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) 166bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_START, EAX), EAX ) 167bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 168bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev TEST_L ( ESI, ESI ) 169bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JZ ( LLBL( G3TP3NRR_3 ) ) 170bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 171bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(ECX), MM0 ) /* | m00 */ 172bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ 173bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 174bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ 175bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 176bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 177bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TP3NRR_2 ): 178bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 179bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(EAX), MM4 ) /* | x0 */ 180bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFMUL ( MM0, MM4 ) /* | x0*m00 */ 181bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 182bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ 183bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ 184bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 185bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( MM3, REGOFF(8, EDX) ) /* write r2 */ 186bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( EDI, EAX ) /* next vertex */ 187bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 188bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( CONST(16), EDX ) /* next r */ 189bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev DEC_L ( ESI ) /* decrement vertex counter */ 190bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 191bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JNZ ( LLBL( G3TP3NRR_2 ) ) /* cnt > 0 ? -> process next vertex */ 192bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 193bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TP3NRR_3 ): 194bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 195bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev FEMMS 196bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( EDI ) 197bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( ESI ) 198bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev RET 199bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 200bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 201bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 202bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 203bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 204bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLOBL GLNAME( _mesa_3dnow_transform_points1_perspective ) 205bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLNAME( _mesa_3dnow_transform_points1_perspective ): 206bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 207bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( ESI ) 208bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 209bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_DEST, ECX ) 210bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_MATRIX, ESI ) 211bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_SOURCE, EAX ) 212bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( CONST(4), REGOFF(V4F_SIZE, ECX) ) 213bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev OR_B ( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, ECX) ) 214bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) 215bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) 216bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 217bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( EDI ) 218bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 219bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(4, ECX), EDX ) 220bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ESI, ECX ) 221bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) 222bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) 223bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_START, EAX), EAX ) 224bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 225bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev TEST_L ( ESI, ESI ) 226bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JZ ( LLBL( G3TPPR_3 ) ) 227bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 228bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(ECX), MM0 ) /* | m00 */ 229bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ 230bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 231bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 232bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TPPR_2 ): 233bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 234bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(EAX), MM4 ) /* 0 | x0 */ 235bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFMUL ( MM0, MM4 ) /* 0 | x0*m00 */ 236bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 237bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ 238bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM3, REGOFF(8, EDX) ) /* write r2 (=m32), r3 (=0) */ 239bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 240bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( EDI, EAX ) /* next vertex */ 241bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( CONST(16), EDX ) /* next r */ 242bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 243bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev DEC_L ( ESI ) /* decrement vertex counter */ 244bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JNZ ( LLBL( G3TPPR_2 ) ) /* cnt > 0 ? -> process next vertex */ 245bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 246bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TPPR_3 ): 247bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 248bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev FEMMS 249bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( EDI ) 250bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( ESI ) 251bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev RET 252bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 253bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 254bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 255bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 256bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 257bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLOBL GLNAME( _mesa_3dnow_transform_points1_2d ) 258bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLNAME( _mesa_3dnow_transform_points1_2d ): 259bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 260bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( ESI ) 261bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 262bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_DEST, ECX ) 263bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_MATRIX, ESI ) 264bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_SOURCE, EAX ) 265bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) 266bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) 267bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) 268bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) 269bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 270bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( EDI ) 271bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 272bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(4, ECX), EDX ) 273bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ESI, ECX ) 274bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) 275bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) 276bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_START, EAX), EAX ) 277bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 278bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev TEST_L ( ESI, ESI ) 279bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JZ ( LLBL( G3TP2R_3 ) ) 280bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 281bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ 282bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ 283bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 284bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 285bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TP2R_2 ): 286bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 287bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(EAX), MM4 ) /* | x0 */ 288bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ 289bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 290bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ 291bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ 292bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 293bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ 294bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( EDI, EAX ) /* next vertex */ 295bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 296bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( CONST(16), EDX ) /* next r */ 297bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev DEC_L ( ESI ) /* decrement vertex counter */ 298bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 299bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JNZ ( LLBL( G3TP2R_2 ) ) /* cnt > 0 ? -> process next vertex */ 300bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 301bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TP2R_3 ): 302bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 303bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev FEMMS 304bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( EDI ) 305bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( ESI ) 306bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev RET 307bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 308bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 309bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 310bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 311bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 312bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLOBL GLNAME( _mesa_3dnow_transform_points1_2d_no_rot ) 313bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLNAME( _mesa_3dnow_transform_points1_2d_no_rot ): 314bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 315bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( ESI ) 316bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 317bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_DEST, ECX ) 318bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_MATRIX, ESI ) 319bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_SOURCE, EAX ) 320bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( CONST(2), REGOFF(V4F_SIZE, ECX) ) 321bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev OR_B ( CONST(VEC_SIZE_2), REGOFF(V4F_FLAGS, ECX) ) 322bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) 323bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) 324bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 325bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( EDI ) 326bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 327bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(4, ECX), EDX ) 328bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ESI, ECX ) 329bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) 330bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) 331bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_START, EAX), EAX ) 332bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 333bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev TEST_L ( ESI, ESI ) 334bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JZ ( LLBL( G3TP2NRR_3 ) ) 335bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 336bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(ECX), MM0 ) /* | m00 */ 337bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ 338bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 339bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 340bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TP2NRR_2 ): 341bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 342bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(EAX), MM4 ) /* | x0 */ 343bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( EDI, EAX ) /* next vertex */ 344bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 345bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFMUL ( MM0, MM4 ) /* | x0*m00 */ 346bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFADD ( MM2, MM4 ) /* m31 | x0*m00+m30 */ 347bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 348bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ 349bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( CONST(16), EDX ) /* next r */ 350bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 351bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev DEC_L ( ESI ) /* decrement vertex counter */ 352bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JNZ ( LLBL( G3TP2NRR_2 ) ) /* cnt > 0 ? -> process next vertex */ 353bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 354bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TP2NRR_3 ): 355bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 356bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev FEMMS 357bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( EDI ) 358bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( ESI ) 359bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev RET 360bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 361bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 362bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 363bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 364bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 365bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLOBL GLNAME( _mesa_3dnow_transform_points1_3d ) 366bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevGLNAME( _mesa_3dnow_transform_points1_3d ): 367bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 368bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( ESI ) 369bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 370bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_DEST, ECX ) 371bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_MATRIX, ESI ) 372bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ARG_SOURCE, EAX ) 373bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( CONST(3), REGOFF(V4F_SIZE, ECX) ) 374bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev OR_B ( CONST(VEC_SIZE_3), REGOFF(V4F_FLAGS, ECX) ) 375bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), EDX ) 376bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( EDX, REGOFF(V4F_COUNT, ECX) ) 377bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 378bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUSH_L ( EDI ) 379bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 380bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(4, ECX), EDX ) 381bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( ESI, ECX ) 382bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_COUNT, EAX), ESI ) 383bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_STRIDE, EAX), EDI ) 384bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOV_L ( REGOFF(V4F_START, EAX), EAX ) 385bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 386bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev TEST_L ( ESI, ESI ) 387bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JZ ( LLBL( G3TP3R_3 ) ) 388bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 389bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGIND(ECX), MM0 ) /* m01 | m00 */ 390bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGOFF(8, ECX), MM1 ) /* | m02 */ 391bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 392bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( REGOFF(48, ECX), MM2 ) /* m31 | m30 */ 393bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGOFF(56, ECX), MM3 ) /* | m32 */ 394bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 395bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevALIGNTEXT16 396bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TP3R_2 ): 397bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 398bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( REGIND(EAX), MM4 ) /* | x0 */ 399bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PUNPCKLDQ ( MM4, MM4 ) /* x0 | x0 */ 400bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 401bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM4, MM5 ) /* | x0 */ 402bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFMUL ( MM0, MM4 ) /* x0*m01 | x0*m00 */ 403bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 404bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFMUL ( MM1, MM5 ) /* | x0*m02 */ 405bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFADD ( MM2, MM4 ) /* x0*m01+m31 | x0*m00+m30 */ 406bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 407bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PFADD ( MM3, MM5 ) /* | x0*m02+m32 */ 408bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVQ ( MM4, REGIND(EDX) ) /* write r1, r0 */ 409bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 410bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev MOVD ( MM5, REGOFF(8, EDX) ) /* write r2 */ 411bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( EDI, EAX ) /* next vertex */ 412bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 413bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ADD_L ( CONST(16), EDX ) /* next r */ 414bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev DEC_L ( ESI ) /* decrement vertex counter */ 415bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 416bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev JNZ ( LLBL( G3TP3R_2 ) ) /* cnt > 0 ? -> process next vertex */ 417bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 418bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevLLBL( G3TP3R_3 ): 419bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 420bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev FEMMS 421bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( EDI ) 422bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev POP_L ( ESI ) 423bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev RET 424bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev