aboutsummaryrefslogtreecommitdiff
path: root/sp/src/mathlib/sse.cpp
diff options
context:
space:
mode:
authorJørgen P. Tjernø <[email protected]>2013-12-03 10:34:47 -0800
committerJørgen P. Tjernø <[email protected]>2013-12-03 10:34:47 -0800
commit30064a19770809fbb25f5f19a11389812c7f22a9 (patch)
tree3f8b0d442e3dae7b429168148fe118e2f843d91b /sp/src/mathlib/sse.cpp
parentFix some accidental new-line stomping. (diff)
downloadsource-sdk-2013-30064a19770809fbb25f5f19a11389812c7f22a9.tar.xz
source-sdk-2013-30064a19770809fbb25f5f19a11389812c7f22a9.zip
Specify clobbered registers in POSIX SSE functions
We weren't specifying clobbered registers for our SSE implementations of VectorNormalize and InvRSquared. Supposedly GCC and clang does not inspect the assembly to figure out which registers are getting clobbered, so this could potentially fix some bugs. This fixes GH-195.
Diffstat (limited to 'sp/src/mathlib/sse.cpp')
-rw-r--r--sp/src/mathlib/sse.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/sp/src/mathlib/sse.cpp b/sp/src/mathlib/sse.cpp
index a2445c79..2260550b 100644
--- a/sp/src/mathlib/sse.cpp
+++ b/sp/src/mathlib/sse.cpp
@@ -259,6 +259,7 @@ float FASTCALL _SSE_VectorNormalize (Vector& vec)
"movaps %%xmm4, %1 \n\t"
: "=m" (radius), "=m" (result)
: "m" (*v)
+ : "xmm1", "xmm2", "xmm3", "xmm4"
);
#else
#error "Not Implemented"
@@ -322,8 +323,9 @@ float _SSE_InvRSquared(const float* v)
"maxss %%xmm5, %%xmm1 \n\t"
"rcpss %%xmm1, %%xmm0 \n\t"
"movss %%xmm0, %0 \n\t"
- : "=m" (inv_r2)
- : "m" (*v), "0" (inv_r2)
+ : "+m" (inv_r2)
+ : "m" (*v)
+ : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"
);
#else
#error "Not Implemented"