about summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-11-07 15:06:55 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-11-07 15:06:55 +0100
commitf5c9439f9110fcb4fde3c7db9f68be7c107b17f6 (patch)
treef0094dbbd242c7bc4526d61c2a1d48717f00324e /tests
parentf73e4193f032713529e26c4537e5fac44147c040 (diff)
downloadbox64-f5c9439f9110fcb4fde3c7db9f68be7c107b17f6.tar.gz
box64-f5c9439f9110fcb4fde3c7db9f68be7c107b17f6.zip
Improved CMPSS/CMPSD opcodes, improved test17 ([DYNAREC] too, and improved MINSS/MAXSS/MINSD/MAXSD too)
Diffstat (limited to 'tests')
-rw-r--r--tests/ref17.txt166
-rwxr-xr-xtests/test17bin19976 -> 29264 bytes
-rw-r--r--tests/test17.c204
3 files changed, 331 insertions, 39 deletions
diff --git a/tests/ref17.txt b/tests/ref17.txt
index 349d50d0..9715adf0 100644
--- a/tests/ref17.txt
+++ b/tests/ref17.txt
@@ -1,12 +1,154 @@
-div 1, 1 => 1 / 0
-div 10, 5 => 2 / 0
-div 10, 3 => 3 / 1
-div 1, 18446744073709551615 => 0 / 1
-div 10, 18446744073709551613 => 0 / 10
-div 18446744073709551606, 18446744073709551613 => 0 / 18446744073709551606
-idiv 1, 1 => 1 / 0
-idiv 10, 5 => 2 / 0
-idiv 10, 3 => 3 / 1
-idiv 1, -1 => -1 / 0
-idiv 10, -3 => -3 / 1
-idiv -10, -3 => 3 / -1
+ucomiss 1.000000, 2.000000 => 0x202
+ucomiss 2.000000, 1.000000 => 0x203
+ucomiss 1.000000, inf => 0x202
+ucomiss inf, 1.000000 => 0x203
+ucomiss 1.000000, -inf => 0x203
+ucomiss -inf, 1.000000 => 0x202
+ucomiss 1.000000, nan => 0x247
+ucomiss nan, 1.000000 => 0x247
+ucomiss 1.000000, 1.000000 => 0x242
+ucomiss 1.000000, 1.000000 => 0x242
+ucomiss inf, inf => 0x242
+ucomiss -inf, inf => 0x202
+ucomiss inf, -inf => 0x203
+ucomiss nan, nan => 0x247
+minss 1, 2 => 1
+minss 2, 1 => 1
+minss -inf, 2 => -inf
+minss 2, -inf => -inf
+minss inf, 2 => 2
+minss 2, inf => 2
+minss nan, 2 => 2
+minss 2, nan => nan
+minss nan, 3.40282e+38 => 3.40282e+38
+minss 3.40282e+38, nan => nan
+minss -inf, 3.40282e+38 => -inf
+minss 3.40282e+38, -inf => -inf
+minss inf, 3.40282e+38 => 3.40282e+38
+minss 3.40282e+38, inf => 3.40282e+38
+maxss 1, 2 => 2
+maxss 2, 1 => 2
+maxss -inf, 2 => 2
+maxss 2, -inf => 2
+maxss inf, 2 => inf
+maxss 2, inf => inf
+maxss nan, 2 => 2
+maxss 2, nan => nan
+maxss nan, 3.40282e+38 => 3.40282e+38
+maxss 3.40282e+38, nan => nan
+maxss -inf, 3.40282e+38 => 3.40282e+38
+maxss 3.40282e+38, -inf => 3.40282e+38
+maxss inf, 3.40282e+38 => inf
+maxss 3.40282e+38, inf => inf
+cmpss 0 1.000000, 2.000000 => 0x0
+cmpss 0 2.000000, 1.000000 => 0x0
+cmpss 0 1.000000, inf => 0x0
+cmpss 0 inf, 1.000000 => 0x0
+cmpss 0 1.000000, -inf => 0x0
+cmpss 0 -inf, 1.000000 => 0x0
+cmpss 0 1.000000, nan => 0x0
+cmpss 0 nan, 1.000000 => 0x0
+cmpss 0 1.000000, 1.000000 => 0xffffffff
+cmpss 0 1.000000, 1.000000 => 0xffffffff
+cmpss 0 inf, inf => 0xffffffff
+cmpss 0 -inf, inf => 0x0
+cmpss 0 inf, -inf => 0x0
+cmpss 0 nan, nan => 0x0
+cmpss 1 1.000000, 2.000000 => 0xffffffff
+cmpss 1 2.000000, 1.000000 => 0x0
+cmpss 1 1.000000, inf => 0xffffffff
+cmpss 1 inf, 1.000000 => 0x0
+cmpss 1 1.000000, -inf => 0x0
+cmpss 1 -inf, 1.000000 => 0xffffffff
+cmpss 1 1.000000, nan => 0x0
+cmpss 1 nan, 1.000000 => 0x0
+cmpss 1 1.000000, 1.000000 => 0x0
+cmpss 1 1.000000, 1.000000 => 0x0
+cmpss 1 inf, inf => 0x0
+cmpss 1 -inf, inf => 0xffffffff
+cmpss 1 inf, -inf => 0x0
+cmpss 1 nan, nan => 0x0
+cmpss 2 1.000000, 2.000000 => 0xffffffff
+cmpss 2 2.000000, 1.000000 => 0x0
+cmpss 2 1.000000, inf => 0xffffffff
+cmpss 2 inf, 1.000000 => 0x0
+cmpss 2 1.000000, -inf => 0x0
+cmpss 2 -inf, 1.000000 => 0xffffffff
+cmpss 2 1.000000, nan => 0x0
+cmpss 2 nan, 1.000000 => 0x0
+cmpss 2 1.000000, 1.000000 => 0xffffffff
+cmpss 2 1.000000, 1.000000 => 0xffffffff
+cmpss 2 inf, inf => 0xffffffff
+cmpss 2 -inf, inf => 0xffffffff
+cmpss 2 inf, -inf => 0x0
+cmpss 2 nan, nan => 0x0
+cmpss 3 1.000000, 2.000000 => 0x0
+cmpss 3 2.000000, 1.000000 => 0x0
+cmpss 3 1.000000, inf => 0x0
+cmpss 3 inf, 1.000000 => 0x0
+cmpss 3 1.000000, -inf => 0x0
+cmpss 3 -inf, 1.000000 => 0x0
+cmpss 3 1.000000, nan => 0xffffffff
+cmpss 3 nan, 1.000000 => 0xffffffff
+cmpss 3 1.000000, 1.000000 => 0x0
+cmpss 3 1.000000, 1.000000 => 0x0
+cmpss 3 inf, inf => 0x0
+cmpss 3 -inf, inf => 0x0
+cmpss 3 inf, -inf => 0x0
+cmpss 3 nan, nan => 0xffffffff
+cmpss 4 1.000000, 2.000000 => 0xffffffff
+cmpss 4 2.000000, 1.000000 => 0xffffffff
+cmpss 4 1.000000, inf => 0xffffffff
+cmpss 4 inf, 1.000000 => 0xffffffff
+cmpss 4 1.000000, -inf => 0xffffffff
+cmpss 4 -inf, 1.000000 => 0xffffffff
+cmpss 4 1.000000, nan => 0xffffffff
+cmpss 4 nan, 1.000000 => 0xffffffff
+cmpss 4 1.000000, 1.000000 => 0x0
+cmpss 4 1.000000, 1.000000 => 0x0
+cmpss 4 inf, inf => 0x0
+cmpss 4 -inf, inf => 0xffffffff
+cmpss 4 inf, -inf => 0xffffffff
+cmpss 4 nan, nan => 0xffffffff
+cmpss 5 1.000000, 2.000000 => 0x0
+cmpss 5 2.000000, 1.000000 => 0xffffffff
+cmpss 5 1.000000, inf => 0x0
+cmpss 5 inf, 1.000000 => 0xffffffff
+cmpss 5 1.000000, -inf => 0xffffffff
+cmpss 5 -inf, 1.000000 => 0x0
+cmpss 5 1.000000, nan => 0xffffffff
+cmpss 5 nan, 1.000000 => 0xffffffff
+cmpss 5 1.000000, 1.000000 => 0xffffffff
+cmpss 5 1.000000, 1.000000 => 0xffffffff
+cmpss 5 inf, inf => 0xffffffff
+cmpss 5 -inf, inf => 0x0
+cmpss 5 inf, -inf => 0xffffffff
+cmpss 5 nan, nan => 0xffffffff
+cmpss 6 1.000000, 2.000000 => 0x0
+cmpss 6 2.000000, 1.000000 => 0xffffffff
+cmpss 6 1.000000, inf => 0x0
+cmpss 6 inf, 1.000000 => 0xffffffff
+cmpss 6 1.000000, -inf => 0xffffffff
+cmpss 6 -inf, 1.000000 => 0x0
+cmpss 6 1.000000, nan => 0xffffffff
+cmpss 6 nan, 1.000000 => 0xffffffff
+cmpss 6 1.000000, 1.000000 => 0x0
+cmpss 6 1.000000, 1.000000 => 0x0
+cmpss 6 inf, inf => 0x0
+cmpss 6 -inf, inf => 0x0
+cmpss 6 inf, -inf => 0xffffffff
+cmpss 6 nan, nan => 0xffffffff
+cmpss 7 1.000000, 2.000000 => 0xffffffff
+cmpss 7 2.000000, 1.000000 => 0xffffffff
+cmpss 7 1.000000, inf => 0xffffffff
+cmpss 7 inf, 1.000000 => 0xffffffff
+cmpss 7 1.000000, -inf => 0xffffffff
+cmpss 7 -inf, 1.000000 => 0xffffffff
+cmpss 7 1.000000, nan => 0x0
+cmpss 7 nan, 1.000000 => 0x0
+cmpss 7 1.000000, 1.000000 => 0xffffffff
+cmpss 7 1.000000, 1.000000 => 0xffffffff
+cmpss 7 inf, inf => 0xffffffff
+cmpss 7 -inf, inf => 0xffffffff
+cmpss 7 inf, -inf => 0xffffffff
+cmpss 7 nan, nan => 0x0
diff --git a/tests/test17 b/tests/test17
index bcfd74f8..e56e6a46 100755
--- a/tests/test17
+++ b/tests/test17
Binary files differdiff --git a/tests/test17.c b/tests/test17.c
index 799c1368..735e861d 100644
--- a/tests/test17.c
+++ b/tests/test17.c
@@ -6,45 +6,195 @@
 #include <math.h>
 
 #if defined(__x86_64__)
-uint64_t _div_(uint64_t a, uint64_t b, uint64_t *r)
+uint64_t _ucomiss_(float a, float b)
 {
-    uint64_t ret, rem;
+    uint64_t ret;
     asm volatile (
-    "xor %%rdx, %%rdx\n"
-    "div %%rcx\n"
-    "mov %%rdx, %%rbx\n"
-    :"=a" (ret), "=b" (rem):"a" (a), "c" (b):"rdx","cc");
-    *r = rem;
+    "ucomiss %%xmm0, %%xmm1\n"
+    "pushf\n"
+    "pop %%rax"
+    :"=a" (ret)::"xmm0","xmm1","cc");
     return ret;
 }
-uint64_t _idiv_(uint64_t a, uint64_t b, uint64_t *r)
+uint64_t _minss_(float a, float b)
 {
-    uint64_t ret, rem;
+    uint64_t ret;
     asm volatile (
-    "cqo\n"
-    "idiv %%rcx\n"
-    "mov %%rdx, %%rbx\n"
-    :"=a" (ret), "=b" (rem):"a" (a), "c" (b):"rdx","cc");
-    *r = rem;
+    "minss %%xmm1, %%xmm0\n"
+    "movd %%xmm0, %%eax"
+    :"=a" (ret)::"xmm0","xmm1","cc");
     return ret;
 }
+uint64_t _maxss_(float a, float b)
+{
+    uint64_t ret;
+    asm volatile (
+    "maxss %%xmm1, %%xmm0\n"
+    "movd %%xmm0, %%eax"
+    :"=a" (ret)::"xmm0","xmm1","cc");
+    return ret;
+}
+#define CMPSS(A)                        \
+uint64_t _cmpss_##A(float a, float b)   \
+{                                       \
+    uint64_t ret;                       \
+    asm volatile (                      \
+    "cmpss $" #A ", %%xmm1, %%xmm0\n"   \
+    "movd %%xmm0, %%eax"                \
+    :"=a" (ret)::"xmm0","xmm1","cc");   \
+    return ret;                         \
+}
 #else
+uint64_t _ucomiss_(float a, float b)
+{
+    uint32_t ret;
+    asm volatile (
+    "movss %1, %%xmm0\n"
+    "movss %2, %%xmm1\n"
+    "ucomiss %%xmm0, %%xmm1\n"
+    "pushf\n"
+    "pop %%eax"
+    :"=a" (ret):"m"(a), "m"(b):"xmm0", "xmm1", "cc");
+    return ret;
+}
+uint64_t _minss_(float a, float b)
+{
+    uint32_t ret;
+    asm volatile (
+    "movss %1, %%xmm0\n"
+    "movss %2, %%xmm1\n"
+    "minss %%xmm1, %%xmm0\n"
+    "movd %%xmm0, %%eax"
+    :"=a" (ret):"m"(a), "m"(b):"xmm0", "xmm1", "cc");
+    return ret;
+}
+uint64_t _maxss_(float a, float b)
+{
+    uint32_t ret;
+    asm volatile (
+    "movss %1, %%xmm0\n"
+    "movss %2, %%xmm1\n"
+    "maxss %%xmm1, %%xmm0\n"
+    "movd %%xmm0, %%eax"
+    :"=a" (ret):"m"(a), "m"(b):"xmm0", "xmm1", "cc");
+    return ret;
+}
+#define CMPSS(A)                                            \
+uint64_t _cmpss_##A(float a, float b)                       \
+{                                                           \
+    uint32_t ret;                                           \
+    asm volatile (                                          \
+    "movss %1, %%xmm0\n"                                    \
+    "movss %2, %%xmm1\n"                                    \
+    "cmpss $" #A ", %%xmm1, %%xmm0\n"                       \
+    "movd %%xmm0, %%eax"                                    \
+    :"=a" (ret):"m"(a), "m"(b):"xmm0", "xmm1", "cc");       \
+    return ret;                                             \
+}
 #endif
+CMPSS(0)
+CMPSS(1)
+CMPSS(2)
+CMPSS(3)
+CMPSS(4)
+CMPSS(5)
+CMPSS(6)
+CMPSS(7)
 
 int main(int argc, const char** argv)
 {
-  uint64_t datas[][2] = {{1,1},{10,5},{10,3},{1, (uint64_t)-1}, {10, (uint64_t)-3}, {(uint64_t)-10, (uint64_t)-3}};
+ float a, b;
+ uint64_t flags;
+ uint32_t maxf = 0x7f7fffff;
+ uint32_t minf = 0xff7fffff;
+ uint32_t r;
+
+#define GO1(A, N)                                   \
+a = 1.0f; b = 2.0f;                                 \
+flags = A(a, b);                                    \
+printf(N " %f, %f => 0x%lx\n", a, b, flags);        \
+flags = A(b, a);                                    \
+printf(N " %f, %f => 0x%lx\n", b, a, flags);        \
+b = INFINITY;                                       \
+flags = A(a, b);                                    \
+printf(N " %f, %f => 0x%lx\n", a, b, flags);        \
+flags = A(b, a);                                    \
+printf(N " %f, %f => 0x%lx\n", b, a, flags);        \
+b = -INFINITY;                                      \
+flags = A(a, b);                                    \
+printf(N " %f, %f => 0x%lx\n", a, b, flags);        \
+flags = A(b, a);                                    \
+printf(N " %f, %f => 0x%lx\n", b, a, flags);        \
+b = NAN;                                            \
+flags = A(a, b);                                    \
+printf(N " %f, %f => 0x%lx\n", a, b, flags);        \
+flags = A(b, a);                                    \
+printf(N " %f, %f => 0x%lx\n", b, a, flags);        \
+b = a;                                              \
+flags = A(a, b);                                    \
+printf(N " %f, %f => 0x%lx\n", a, b, flags);        \
+flags = A(b, a);                                    \
+printf(N " %f, %f => 0x%lx\n", b, a, flags);        \
+a = b = INFINITY;                                   \
+flags = A(a, b);                                    \
+printf(N " %f, %f => 0x%lx\n", a, b, flags);        \
+a = -INFINITY;                                      \
+flags = A(a, b);                                    \
+printf(N " %f, %f => 0x%lx\n", a, b, flags);        \
+flags = A(b, a);                                    \
+printf(N " %f, %f => 0x%lx\n", b, a, flags);        \
+a = b = NAN;                                        \
+flags = A(a, b);                                    \
+printf(N " %f, %f => 0x%lx\n", a, b, flags);
+
+#define GO2(A, N)                               \
+a = 1.0f; b = 2.0f;                             \
+r = A(a, b);                                    \
+printf(N " %g, %g => %g\n", a, b, *(float*)&r); \
+r = A(b, a);                                    \
+printf(N " %g, %g => %g\n", b, a, *(float*)&r); \
+a = -INFINITY;                                  \
+r = A(a, b);                                    \
+printf(N " %g, %g => %g\n", a, b, *(float*)&r); \
+r = A(b, a);                                    \
+printf(N " %g, %g => %g\n", b, a, *(float*)&r); \
+a = +INFINITY;                                  \
+r = A(a, b);                                    \
+printf(N " %g, %g => %g\n", a, b, *(float*)&r); \
+r = A(b, a);                                    \
+printf(N " %g, %g => %g\n", b, a, *(float*)&r); \
+a = NAN;                                        \
+r = A(a, b);                                    \
+printf(N " %g, %g => %g\n", a, b, *(float*)&r); \
+r = A(b, a);                                    \
+printf(N " %g, %g => %g\n", b, a, *(float*)&r); \
+b = *(float*)&maxf;                             \
+r = A(a, b);                                    \
+printf(N " %g, %g => %g\n", a, b, *(float*)&r); \
+r = A(b, a);                                    \
+printf(N " %g, %g => %g\n", b, a, *(float*)&r); \
+a = -INFINITY;                                  \
+r = A(a, b);                                    \
+printf(N " %g, %g => %g\n", a, b, *(float*)&r); \
+r = A(b, a);                                    \
+printf(N " %g, %g => %g\n", b, a, *(float*)&r); \
+a = +INFINITY;                                  \
+r = A(a, b);                                    \
+printf(N " %g, %g => %g\n", a, b, *(float*)&r); \
+r = A(b, a);                                    \
+printf(N " %g, %g => %g\n", b, a, *(float*)&r);
 
-  int sz = sizeof(datas)/sizeof(datas[0]);
-  for(int i=0; i<sz; ++i) {
-   uint64_t rem = 0;
-   uint64_t d = _div_(datas[i][0], datas[i][1], &rem);
-   printf("div %llu, %llu => %llu / %llu\n", datas[i][0], datas[i][1], d, rem);
- }
-  for(int i=0; i<sz; ++i) {
-   uint64_t rem = 0;
-   uint64_t d = _idiv_(datas[i][0], datas[i][1], &rem);
-   printf("idiv %lld, %lld => %lld / %lld\n", datas[i][0], datas[i][1], d, rem);
- }
-  return 0;
+ GO1(_ucomiss_, "ucomiss")
+ GO2(_minss_, "minss")
+ GO2(_maxss_, "maxss")
+ GO1(_cmpss_0, "cmpss 0")
+ GO1(_cmpss_1, "cmpss 1")
+ GO1(_cmpss_2, "cmpss 2")
+ GO1(_cmpss_3, "cmpss 3")
+ GO1(_cmpss_4, "cmpss 4")
+ GO1(_cmpss_5, "cmpss 5")
+ GO1(_cmpss_6, "cmpss 6")
+ GO1(_cmpss_7, "cmpss 7")
+ 
+ return 0;
 }