diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-11-07 15:06:55 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-11-07 15:06:55 +0100 |
| commit | f5c9439f9110fcb4fde3c7db9f68be7c107b17f6 (patch) | |
| tree | f0094dbbd242c7bc4526d61c2a1d48717f00324e /tests | |
| parent | f73e4193f032713529e26c4537e5fac44147c040 (diff) | |
| download | box64-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.txt | 166 | ||||
| -rwxr-xr-x | tests/test17 | bin | 19976 -> 29264 bytes | |||
| -rw-r--r-- | tests/test17.c | 204 |
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; } |