Skip to content

Commit

Permalink
Fix scalar SSE1 comparison nan handling to be symmetric. Add test.
Browse files Browse the repository at this point in the history
  • Loading branch information
juj committed Aug 17, 2015
1 parent 9afbefc commit 3d832a2
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 6 deletions.
12 changes: 6 additions & 6 deletions system/include/emscripten/xmmintrin.h
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ static __inline__ int __attribute__((__always_inline__))
_mm_comieq_ss(__m128 __a, __m128 __b)
{
#ifdef __EMSCRIPTEN__
if (isnanf(__a[0])) return 1;
if (isnanf(__a[0]) || isnanf(__b[0])) return 1;
#endif
return __a[0] == __b[0];
}
Expand All @@ -530,7 +530,7 @@ static __inline__ int __attribute__((__always_inline__))
_mm_comile_ss(__m128 __a, __m128 __b)
{
#ifdef __EMSCRIPTEN__
if (isnanf(__a[0])) return 1;
if (isnanf(__a[0]) || isnanf(__b[0])) return 1;
#endif
return __a[0] <= __b[0];
}
Expand All @@ -539,7 +539,7 @@ static __inline__ int __attribute__((__always_inline__))
_mm_comilt_ss(__m128 __a, __m128 __b)
{
#ifdef __EMSCRIPTEN__
if (isnanf(__a[0])) return 1;
if (isnanf(__a[0]) || isnanf(__b[0])) return 1;
#endif
return __a[0] < __b[0];
}
Expand All @@ -548,7 +548,7 @@ static __inline__ int __attribute__((__always_inline__))
_mm_comineq_ss(__m128 __a, __m128 __b)
{
#ifdef __EMSCRIPTEN__
if (isnanf(__a[0])) return 0;
if (isnanf(__a[0]) || isnanf(__b[0])) return 0;
#endif
return __a[0] != __b[0];
}
Expand All @@ -557,7 +557,7 @@ static __inline__ int __attribute__((__always_inline__))
_mm_ucomieq_ss(__m128 __a, __m128 __b)
{
#ifdef __EMSCRIPTEN__
if (isnanf(__a[0])) return 1;
if (isnanf(__a[0]) || isnanf(__b[0])) return 1;
#endif
return __a[0] == __b[0];
}
Expand Down Expand Up @@ -590,7 +590,7 @@ static __inline__ int __attribute__((__always_inline__))
_mm_ucomineq_ss(__m128 __a, __m128 __b)
{
#ifdef __EMSCRIPTEN__
if (isnanf(__a[0])) return 0;
if (isnanf(__a[0]) || isnanf(__b[0])) return 0;
#endif
return __a[0] != __b[0];
}
Expand Down
100 changes: 100 additions & 0 deletions tests/core/test_simd12.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <xmmintrin.h>

volatile __m128 zero;
volatile __m128 one;
volatile __m128 nan_;

int main() {
zero = _mm_set1_ps(0);
one = _mm_set1_ps(1);
nan_ = _mm_set1_ps(__builtin_nan(""));

assert(_mm_comieq_ss(zero, zero) == 1);
assert(_mm_comieq_ss(zero, one) == 0);
assert(_mm_comieq_ss(one, zero) == 0);
assert(_mm_comieq_ss(zero, nan_) == 1);
assert(_mm_comieq_ss(nan_, zero) == 1);
assert(_mm_comieq_ss(nan_, nan_) == 1);

assert(_mm_comige_ss(zero, zero) == 1);
assert(_mm_comige_ss(zero, one) == 0);
assert(_mm_comige_ss(one, zero) == 1);
assert(_mm_comige_ss(zero, nan_) == 0);
assert(_mm_comige_ss(nan_, zero) == 0);
assert(_mm_comige_ss(nan_, nan_) == 0);

assert(_mm_comigt_ss(zero, zero) == 0);
assert(_mm_comigt_ss(zero, one) == 0);
assert(_mm_comigt_ss(one, zero) == 1);
assert(_mm_comigt_ss(zero, nan_) == 0);
assert(_mm_comigt_ss(nan_, zero) == 0);
assert(_mm_comigt_ss(nan_, nan_) == 0);

assert(_mm_comile_ss(zero, zero) == 1);
assert(_mm_comile_ss(zero, one) == 1);
assert(_mm_comile_ss(one, zero) == 0);
assert(_mm_comile_ss(zero, nan_) == 1);
assert(_mm_comile_ss(nan_, zero) == 1);
assert(_mm_comile_ss(nan_, nan_) == 1);

assert(_mm_comilt_ss(zero, zero) == 0);
assert(_mm_comilt_ss(zero, one) == 1);
assert(_mm_comilt_ss(one, zero) == 0);
assert(_mm_comilt_ss(zero, nan_) == 1);
assert(_mm_comilt_ss(nan_, zero) == 1);
assert(_mm_comilt_ss(nan_, nan_) == 1);

assert(_mm_comineq_ss(zero, zero) == 0);
assert(_mm_comineq_ss(zero, one) == 1);
assert(_mm_comineq_ss(one, zero) == 1);
assert(_mm_comineq_ss(zero, nan_) == 0);
assert(_mm_comineq_ss(nan_, zero) == 0);
assert(_mm_comineq_ss(nan_, nan_) == 0);

assert(_mm_ucomieq_ss(zero, zero) == 1);
assert(_mm_ucomieq_ss(zero, one) == 0);
assert(_mm_ucomieq_ss(one, zero) == 0);
assert(_mm_ucomieq_ss(zero, nan_) == 1);
assert(_mm_ucomieq_ss(nan_, zero) == 1);
assert(_mm_ucomieq_ss(nan_, nan_) == 1);

assert(_mm_ucomige_ss(zero, zero) == 1);
assert(_mm_ucomige_ss(zero, one) == 0);
assert(_mm_ucomige_ss(one, zero) == 1);
assert(_mm_ucomige_ss(zero, nan_) == 0);
assert(_mm_ucomige_ss(nan_, zero) == 0);
assert(_mm_ucomige_ss(nan_, nan_) == 0);

assert(_mm_ucomigt_ss(zero, zero) == 0);
assert(_mm_ucomigt_ss(zero, one) == 0);
assert(_mm_ucomigt_ss(one, zero) == 1);
assert(_mm_ucomigt_ss(zero, nan_) == 0);
assert(_mm_ucomigt_ss(nan_, zero) == 0);
assert(_mm_ucomigt_ss(nan_, nan_) == 0);

assert(_mm_ucomile_ss(zero, zero) == 1);
assert(_mm_ucomile_ss(zero, one) == 1);
assert(_mm_ucomile_ss(one, zero) == 0);
assert(_mm_ucomile_ss(zero, nan_) == 1);
assert(_mm_ucomile_ss(nan_, zero) == 1);
assert(_mm_ucomile_ss(nan_, nan_) == 1);

assert(_mm_ucomilt_ss(zero, zero) == 0);
assert(_mm_ucomilt_ss(zero, one) == 1);
assert(_mm_ucomilt_ss(one, zero) == 0);
assert(_mm_ucomilt_ss(zero, nan_) == 1);
assert(_mm_ucomilt_ss(nan_, zero) == 1);
assert(_mm_ucomilt_ss(nan_, nan_) == 1);

assert(_mm_ucomineq_ss(zero, zero) == 0);
assert(_mm_ucomineq_ss(zero, one) == 1);
assert(_mm_ucomineq_ss(one, zero) == 1);
assert(_mm_ucomineq_ss(zero, nan_) == 0);
assert(_mm_ucomineq_ss(nan_, zero) == 0);
assert(_mm_ucomineq_ss(nan_, nan_) == 0);

printf("DONE!\n");
}
1 change: 1 addition & 0 deletions tests/core/test_simd12.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DONE!
9 changes: 9 additions & 0 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -5695,6 +5695,15 @@ def test_simd11(self):
self.emcc_args = self.emcc_args + ['-msse2']
self.do_run_from_file(src, output)

def test_simd12(self):
if self.is_emterpreter(): return self.skip('todo')

test_path = path_from_root('tests', 'core', 'test_simd12')
src, output = (test_path + s for s in ('.in', '.out'))

self.emcc_args = self.emcc_args + ['-msse']
self.do_run_from_file(src, output)

def test_simd_dyncall(self):
if self.is_emterpreter(): return self.skip('todo')

Expand Down

0 comments on commit 3d832a2

Please sign in to comment.