diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-10-30 10:33:14 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-10-30 10:33:14 -0700 |
commit | 97f20af483140174e96385f142df43d7251cfccb (patch) | |
tree | cbc0a0f519b278b77e75f26063493e90d3c9c65f | |
parent | 82c96614ab469777da35013e698fa0c8873c231e (diff) |
improve simd tests
-rw-r--r-- | tests/test_core.py | 61 | ||||
-rw-r--r-- | tests/test_other.py | 61 |
2 files changed, 60 insertions, 62 deletions
diff --git a/tests/test_core.py b/tests/test_core.py index bed451dd..b421659c 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -8660,7 +8660,66 @@ void*:16 main = main[:main.find('\n}')] assert main.count('\n') == 7, 'must not emit too many postSets: %d' % main.count('\n') - def test_simd3(self): + def test_simd(self): + if Settings.USE_TYPED_ARRAYS != 2: return self.skip('needs ta2') + if Settings.ASM_JS: Settings.ASM_JS = 2 # does not validate + src = r''' +#include <stdio.h> + +#include <emscripten/vector.h> + +static inline float32x4 __attribute__((always_inline)) +_mm_set_ps(const float __Z, const float __Y, const float __X, const float __W) +{ + return (float32x4){ __W, __X, __Y, __Z }; +} + +int main(int argc, char **argv) { + float data[8]; + for (int i = 0; i < 32; i++) data[i] = (1+i+argc)*(2+i+argc*argc); + { + float32x4 *a = (float32x4*)&data[0]; + float32x4 *b = (float32x4*)&data[4]; + float32x4 c, d; + c = *a; + d = *b; + printf("1floats! %d, %d, %d, %d %d, %d, %d, %d\n", (int)c[0], (int)c[1], (int)c[2], (int)c[3], (int)d[0], (int)d[1], (int)d[2], (int)d[3]); + c = c+d; + printf("2floats! %d, %d, %d, %d %d, %d, %d, %d\n", (int)c[0], (int)c[1], (int)c[2], (int)c[3], (int)d[0], (int)d[1], (int)d[2], (int)d[3]); + d = c*d; + printf("3floats! %d, %d, %d, %d %d, %d, %d, %d\n", (int)c[0], (int)c[1], (int)c[2], (int)c[3], (int)d[0], (int)d[1], (int)d[2], (int)d[3]); + } + { + uint32x4 *a = (uint32x4*)&data[0]; + uint32x4 *b = (uint32x4*)&data[4]; + uint32x4 c, d, e, f; + c = *a; + d = *b; + printf("4uints! %d, %d, %d, %d %d, %d, %d, %d\n", c[0], c[1], c[2], c[3], d[0], d[1], d[2], d[3]); + e = c+d; + f = c-d; + printf("5uints! %d, %d, %d, %d %d, %d, %d, %d\n", e[0], e[1], e[2], e[3], f[0], f[1], f[2], f[3]); + } + { + float32x4 c, d, e, f; + c = _mm_set_ps(9.0, 4.0, 0, -9.0); + d = _mm_set_ps(10.0, 14.0, -12, -2.0); + printf("6floats! %d, %d, %d, %d %d, %d, %d, %d\n", (int)c[0], (int)c[1], (int)c[2], (int)c[3], (int)d[0], (int)d[1], (int)d[2], (int)d[3]); + } + + return 0; +} + ''' + + self.do_run(src, '''1floats! 6, 12, 20, 30 42, 56, 72, 90 +2floats! 48, 68, 92, 120 42, 56, 72, 90 +3floats! 48, 68, 92, 120 2016, 3808, 6624, 10800 +4uints! 1086324736, 1094713344, 1101004800, 1106247680 1109917696, 1113587712, 1116733440, 1119092736 +5uints! -2098724864, -2086666240, -2077229056, -2069626880 -23592960, -18874368, -15728640, -12845056 +6floats! -9, 0, 4, 9 -2, -12, 14, 10 +''') + + def test_simd2(self): if Settings.ASM_JS: Settings.ASM_JS = 2 # does not validate self.do_run(r''' diff --git a/tests/test_other.py b/tests/test_other.py index 185e83d1..86e0eadf 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -2015,64 +2015,3 @@ a(int [32], char [5]*) Popen([PYTHON, EMCC, path_from_root('tests', 'linpack.c'), '-O2', '-DSP', '--llvm-opts', '''['-O3', '-vectorize', '-vectorize-loops', '-bb-vectorize-vector-bits=128', '-force-vector-width=4']''']).communicate() self.assertContained('Unrolled Single Precision', run_js('a.out.js')) - def test_simd2(self): - self.clear() - open('src.cpp', 'w').write(r''' -#include <stdio.h> - -#include <emscripten/vector.h> - -static inline float32x4 __attribute__((always_inline)) -_mm_set_ps(const float __Z, const float __Y, const float __X, const float __W) -{ - return (float32x4){ __W, __X, __Y, __Z }; -} - -int main(int argc, char **argv) { - float data[8]; - for (int i = 0; i < 32; i++) data[i] = (1+i+argc)*(2+i+argc*argc); - { - float32x4 *a = (float32x4*)&data[0]; - float32x4 *b = (float32x4*)&data[4]; - float32x4 c, d; - c = *a; - d = *b; - printf("1floats! %d, %d, %d, %d %d, %d, %d, %d\n", (int)c[0], (int)c[1], (int)c[2], (int)c[3], (int)d[0], (int)d[1], (int)d[2], (int)d[3]); - c = c+d; - printf("2floats! %d, %d, %d, %d %d, %d, %d, %d\n", (int)c[0], (int)c[1], (int)c[2], (int)c[3], (int)d[0], (int)d[1], (int)d[2], (int)d[3]); - d = c*d; - printf("3floats! %d, %d, %d, %d %d, %d, %d, %d\n", (int)c[0], (int)c[1], (int)c[2], (int)c[3], (int)d[0], (int)d[1], (int)d[2], (int)d[3]); - } - { - uint32x4 *a = (uint32x4*)&data[0]; - uint32x4 *b = (uint32x4*)&data[4]; - uint32x4 c, d, e, f; - c = *a; - d = *b; - printf("4uints! %d, %d, %d, %d %d, %d, %d, %d\n", c[0], c[1], c[2], c[3], d[0], d[1], d[2], d[3]); - e = c+d; - f = c-d; - printf("5uints! %d, %d, %d, %d %d, %d, %d, %d\n", e[0], e[1], e[2], e[3], f[0], f[1], f[2], f[3]); - } - { - float32x4 c, d, e, f; - c = _mm_set_ps(9.0, 4.0, 0, -9.0); - d = _mm_set_ps(10.0, 14.0, -12, -2.0); - printf("6floats! %d, %d, %d, %d %d, %d, %d, %d\n", (int)c[0], (int)c[1], (int)c[2], (int)c[3], (int)d[0], (int)d[1], (int)d[2], (int)d[3]); - } - - return 0; -} - ''') - - for opts in [[], ['-O1'], ['-O2']]: - print opts - Popen([PYTHON, EMCC, 'src.cpp'] + opts).communicate() - self.assertContained('''1floats! 6, 12, 20, 30 42, 56, 72, 90 -2floats! 48, 68, 92, 120 42, 56, 72, 90 -3floats! 48, 68, 92, 120 2016, 3808, 6624, 10800 -4uints! 1086324736, 1094713344, 1101004800, 1106247680 1109917696, 1113587712, 1116733440, 1119092736 -5uints! -2098724864, -2086666240, -2077229056, -2069626880 -23592960, -18874368, -15728640, -12845056 -6floats! -9, 0, 4, 9 -2, -12, 14, 10 -''', run_js('a.out.js')) - |