diff options
author | Thilo Schulz <arny@ats.s.bawue.de> | 2011-06-13 10:54:37 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2013-01-09 23:15:55 +0000 |
commit | d4c0287699091dc0b6e1e19a83210bcb3f093064 (patch) | |
tree | aec29c00f06943846a68659fb5e60dd58622a46e /src/asm/snapvector.c | |
parent | fca35e6b402050ae45f3ca463b0ff48daafda987 (diff) |
Forgot the inline assembler parts, here they come! Using inline asm to get rid of all the boilerplate stuff
Diffstat (limited to 'src/asm/snapvector.c')
-rw-r--r-- | src/asm/snapvector.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/asm/snapvector.c b/src/asm/snapvector.c new file mode 100644 index 00000000..ea124500 --- /dev/null +++ b/src/asm/snapvector.c @@ -0,0 +1,82 @@ +/* +=========================================================================== +Copyright (C) 2011 Thilo Schulz <thilo@tjps.eu> + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Quake III Arena source code; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "qasm-inline.h" +#include "../qcommon/q_shared.h" + +/* + * GNU inline asm version of qsnapvector + */ + +static unsigned char ssemask[16] __attribute__((aligned(16))) = +{ + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00" +}; + +static unsigned int ssecw __attribute__((aligned(16))) = 0x00001F80; +static unsigned short fpucw = 0x037F; + +void qsnapvectorsse(vec3_t vec) +{ + __asm__ volatile + ( + "sub $4, " ESP "\n" + "stmxcsr (" ESP ")\n" + "ldmxcsr %1\n" + + "movaps (%0), %%xmm1\n" + "movups (" EDI "), %%xmm0\n" + "cvtps2dq %%xmm0, %%xmm0\n" + "cvtdq2ps %%xmm0, %%xmm0\n" + "maskmovdqu %%xmm1, %%xmm0\n" + + "ldmxcsr (" ESP ")\n" + "add $4, " ESP "\n" + : + : "r" (ssemask), "m" (ssecw), "D" (vec) + : "memory", "%xmm0", "%xmm1" + ); +} + +#define QROUNDX87(src) \ + "flds " src "\n" \ + "fistp " src "\n" \ + "fild " src "\n" \ + "fstp " src "\n" + +void qsnapvectorx87(vec3_t vec) +{ + __asm__ volatile + ( + "sub $2, " ESP "\n" + "fnstcw (" ESP ")\n" + "fldcw %0\n" + QROUNDX87("(" EAX ")") + QROUNDX87("4(" EAX ")") + QROUNDX87("8(" EAX ")") + "fldcw (" ESP ")\n" + "add $2, " ESP "\n" + : + : "m" (fpucw), "a" (vec) + : "memory" + ); +} |