19fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/* 29fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCopyright (C) 1996-1997 Id Software, Inc. 39fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 49fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is free software; you can redistribute it and/or 59fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammodify it under the terms of the GNU General Public License 69fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamas published by the Free Software Foundation; either version 2 79fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamof the License, or (at your option) any later version. 89fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 99fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is distributed in the hope that it will be useful, 109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambut WITHOUT ANY WARRANTY; without even the implied warranty of 119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSee the GNU General Public License for more details. 149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamYou should have received a copy of the GNU General Public License 169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamalong with this program; if not, write to the Free Software 179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/ 209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// 219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// r_aliasa.s 229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// x86 assembly-language Alias model transform and project code. 239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// 249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "asm_i386.h" 269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakeasm.h" 279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "asm_draw.h" 289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "d_ifacea.h" 299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#if id386 319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream .data 339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLfloat_1: .single 1.0 359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLtemp: .long 0 369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLcoords: .long 0, 0, 0 379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream .text 399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define fv 12+4 419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define pstverts 12+8 429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream.globl C(R_AliasTransformAndProjectFinalVerts) 449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamC(R_AliasTransformAndProjectFinalVerts): 459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream pushl %ebp // preserve caller's stack frame 469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream pushl %edi 479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream pushl %esi // preserve register variables 489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// int i, temp; 509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// float lightcos, *plightnormal, zi; 519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// trivertx_t *pverts; 529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// pverts = r_apverts; 549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl C(r_apverts),%esi 559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// for (i=0 ; i<r_anumverts ; i++, fv++, pverts++, pstverts++) 579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// { 589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl pstverts(%esp),%ebp 599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl fv(%esp),%edi 609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl C(r_anumverts),%ecx 619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream subl %edx,%edx 629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLloop: 649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// // transform and project 669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// zi = 1.0 / (DotProduct(pverts->v, aliastransform[2]) + 679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// aliastransform[2][3]); 689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movb (%esi),%dl 699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movb %dl,Lcoords 709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fildl Lcoords // v[0] 719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movb 1(%esi),%dl 729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movb %dl,Lcoords+4 739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fildl Lcoords+4 // v[1] | v[0] 749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movb 2(%esi),%dl 759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movb %dl,Lcoords+8 769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fildl Lcoords+8 // v[2] | v[1] | v[0] 779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fld %st(2) // v[0] | v[2] | v[1] | v[0] 799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+32 // accum | v[2] | v[1] | v[0] 809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fld %st(2) // v[1] | accum | v[2] | v[1] | v[0] 819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+36 // accum2 | accum | v[2] | v[1] | v[0] 829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) // accum | accum2 | v[2] | v[1] | v[0] 839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fadds C(aliastransform)+44 // accum | accum2 | v[2] | v[1] | v[0] 849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fld %st(2) // v[2] | accum | accum2 | v[2] | v[1] | v[0] 859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+40 // accum3 | accum | accum2 | v[2] | v[1] | 869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // v[0] 879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) // accum | accum3 | accum2 | v[2] | v[1] | v[0] 889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream faddp %st(0),%st(2) // accum3 | accum | v[2] | v[1] | v[0] 899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movb tv_lightnormalindex(%esi),%dl 909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl stv_s(%ebp),%eax 919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl %eax,fv_v+8(%edi) 929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream faddp %st(0),%st(1) // z | v[2] | v[1] | v[0] 939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl stv_t(%ebp),%eax 959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl %eax,fv_v+12(%edi) 969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// // lighting 989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// plightnormal = r_avertexnormals[pverts->lightnormalindex]; 999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fdivrs Lfloat_1 // zi | v[2] | v[1] | v[0] 1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fv->v[2] = pstverts->s; 1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fv->v[3] = pstverts->t; 1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fv->flags = pstverts->onseam; 1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl stv_onseam(%ebp),%eax 1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl %eax,fv_flags(%edi) 1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl fv_size(%edi),%eax 1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl stv_size(%ebp),%eax 1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl 4(%esi),%eax 1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream leal (%edx,%edx,2),%eax // index*3 1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(3) // v[0] | v[2] | v[1] | zi 1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// lightcos = DotProduct (plightnormal, r_plightvec); 1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream flds C(r_avertexnormals)(,%eax,4) 1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(r_plightvec) 1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream flds C(r_avertexnormals)+4(,%eax,4) 1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(r_plightvec)+4 1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream flds C(r_avertexnormals)+8(,%eax,4) 1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(r_plightvec)+8 1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) 1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream faddp %st(0),%st(2) 1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fld %st(2) // v[0] | laccum | laccum2 | v[0] | v[2] | 1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // v[1] | zi 1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+0 // xaccum | laccum | laccum2 | v[0] | v[2] | 1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // v[1] | zi 1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(2) // laccum2 | laccum | xaccum | v[0] | v[2] | 1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // v[1] | zi 1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream faddp %st(0),%st(1) // laccum | xaccum | v[0] | v[2] | v[1] | zi 1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// temp = r_ambientlight; 1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// if (lightcos < 0) 1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// { 1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fsts Ltemp 1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl C(r_ambientlight),%eax 1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movb Ltemp+3,%dl 1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream testb $0x80,%dl 1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream jz Lsavelight // no need to clamp if only ambient lit, because 1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // r_ambientlight is preclamped 1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// temp += (int)(r_shadelight * lightcos); 1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(r_shadelight) 1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// FIXME: fast float->int conversion? 1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fistpl Ltemp 1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream addl Ltemp,%eax 1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// // clamp; because we limited the minimum ambient and shading light, we 1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// // don't have to clamp low light, just bright 1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// if (temp < 0) 1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// temp = 0; 1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream jns Lp1 1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream subl %eax,%eax 1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// } 1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLp1: 1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fv->v[4] = temp; 1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// 1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// // x, y, and z are scaled down by 1/2**31 in the transform, so 1/z is 1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// // scaled up by 1/2**31, and the scaling cancels out for x and y in the 1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// // projection 1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fv->v[0] = ((DotProduct(pverts->v, aliastransform[0]) + 1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// aliastransform[0][3]) * zi) + aliasxcenter; 1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fv->v[1] = ((DotProduct(pverts->v, aliastransform[1]) + 1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// aliastransform[1][3]) * zi) + aliasycenter; 1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// fv->v[5] = zi; 1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) // v[0] | xaccum | v[2] | v[1] | zi 1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+16 // yaccum | xaccum | v[2] | v[1] | zi 1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(3) // v[1] | xaccum | v[2] | yaccum | zi 1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fld %st(0) // v[1] | v[1] | xaccum | v[2] | yaccum | zi 1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+4 // xaccum2 | v[1] | xaccum | v[2] | yaccum |zi 1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) // v[1] | xaccum2 | xaccum | v[2] | yaccum |zi 1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream movl %eax,fv_v+16(%edi) 1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+20 // yaccum2 | xaccum2 | xaccum | v[2] | yaccum| 1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // zi 1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(2) // xaccum | xaccum2 | yaccum2 | v[2] | yaccum| 1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // zi 1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fadds C(aliastransform)+12 // xaccum | xaccum2 | yaccum2 | v[2] | yaccum| 1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // zi 1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(4) // yaccum | xaccum2 | yaccum2 | v[2] | xaccum| 1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // zi 1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fadds C(aliastransform)+28 // yaccum | xaccum2 | yaccum2 | v[2] | xaccum| 1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // zi 1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(3) // v[2] | xaccum2 | yaccum2 | yaccum | xaccum| 1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // zi 1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fld %st(0) // v[2] | v[2] | xaccum2 | yaccum2 | yaccum | 1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // xaccum | zi 1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+8 // xaccum3 | v[2] | xaccum2 | yaccum2 |yaccum| 1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // xaccum | zi 1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) // v[2] | xaccum3 | xaccum2 | yaccum2 |yaccum| 1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // xaccum | zi 1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmuls C(aliastransform)+24 // yaccum3 | xaccum3 | xaccum2 | yaccum2 | 1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // yaccum | xaccum | zi 1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(5) // xaccum | xaccum3 | xaccum2 | yaccum2 | 1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // yaccum | yaccum3 | zi 1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream faddp %st(0),%st(2) // xaccum3 | xaccum | yaccum2 | yaccum | 2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // yaccum3 | zi 2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(3) // yaccum | xaccum | yaccum2 | xaccum3 | 2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream // yaccum3 | zi 2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream faddp %st(0),%st(2) // xaccum | yaccum | xaccum3 | yaccum3 | zi 2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream addl $(tv_size),%esi 2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream faddp %st(0),%st(2) // yaccum | x | yaccum3 | zi 2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream faddp %st(0),%st(2) // x | y | zi 2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream addl $(stv_size),%ebp 2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmul %st(2),%st(0) // x/z | y | zi 2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) // y | x/z | zi 2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fmul %st(2),%st(0) // y/z | x/z | zi 2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) // x/z | y/z | zi 2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fadds C(aliasxcenter) // u | y/z | zi 2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(1) // y/z | u | zi 2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fadds C(aliasycenter) // v | u | zi 2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fxch %st(2) // zi | u | v 2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// FIXME: fast float->int conversion? 2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fistpl fv_v+20(%edi) // u | v 2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fistpl fv_v+0(%edi) // v 2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fistpl fv_v+4(%edi) 2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// } 2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream addl $(fv_size),%edi 2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream decl %ecx 2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream jnz Lloop 2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream popl %esi // restore register variables 2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream popl %edi 2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream popl %ebp // restore the caller's stack frame 2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream ret 2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLsavelight: 2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream fstp %st(0) 2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream jmp Lp1 2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif // id386 2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 238