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