Improved ucomiss test17 with minss and maxss testing

This commit is contained in:
ptitSeb 2021-10-10 20:11:01 +02:00
parent aee4ee9430
commit 535db78525
3 changed files with 143 additions and 0 deletions

View File

@ -9,3 +9,31 @@ ucomiss nan, 1.000000 => 0x247
ucomiss 1.000000, 1.000000 => 0x242
ucomiss inf, inf => 0x242
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

Binary file not shown.

View File

@ -16,6 +16,24 @@ uint64_t _ucomiss_(float a, float b)
:"=a" (ret)::"xmm0","xmm1","cc");
return ret;
}
uint64_t _minss_(float a, float b)
{
uint64_t ret;
asm volatile (
"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;
}
#else
uint64_t _ucomiss_(float a, float b)
{
@ -29,12 +47,37 @@ uint64_t _ucomiss_(float a, float b)
:"=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;
}
#endif
int main(int argc, const char** argv)
{
float a, b;
uint64_t flags;
uint32_t maxf = 0x7f7fffff;
uint32_t minf = 0xff7fffff;
uint32_t r;
a = 1.0f; b = 2.0f;
flags = _ucomiss_(a, b);
printf("ucomiss %f, %f => 0x%lx\n", a, b, flags);
@ -65,5 +108,77 @@ int main(int argc, const char** argv)
flags = _ucomiss_(a, b);
printf("ucomiss %f, %f => 0x%lx\n", a, b, flags);
a = 1.0f; b = 2.0f;
r = _minss_(a, b);
printf("minss %g, %g => %g\n", a, b, *(float*)&r);
r = _minss_(b, a);
printf("minss %g, %g => %g\n", b, a, *(float*)&r);
a = -INFINITY;
r = _minss_(a, b);
printf("minss %g, %g => %g\n", a, b, *(float*)&r);
r = _minss_(b, a);
printf("minss %g, %g => %g\n", b, a, *(float*)&r);
a = +INFINITY;
r = _minss_(a, b);
printf("minss %g, %g => %g\n", a, b, *(float*)&r);
r = _minss_(b, a);
printf("minss %g, %g => %g\n", b, a, *(float*)&r);
a = NAN;
r = _minss_(a, b);
printf("minss %g, %g => %g\n", a, b, *(float*)&r);
r = _minss_(b, a);
printf("minss %g, %g => %g\n", b, a, *(float*)&r);
b = *(float*)&maxf;
r = _minss_(a, b);
printf("minss %g, %g => %g\n", a, b, *(float*)&r);
r = _minss_(b, a);
printf("minss %g, %g => %g\n", b, a, *(float*)&r);
a = -INFINITY;
r = _minss_(a, b);
printf("minss %g, %g => %g\n", a, b, *(float*)&r);
r = _minss_(b, a);
printf("minss %g, %g => %g\n", b, a, *(float*)&r);
a = +INFINITY;
r = _minss_(a, b);
printf("minss %g, %g => %g\n", a, b, *(float*)&r);
r = _minss_(b, a);
printf("minss %g, %g => %g\n", b, a, *(float*)&r);
a = 1.0f; b = 2.0f;
r = _maxss_(a, b);
printf("maxss %g, %g => %g\n", a, b, *(float*)&r);
r = _maxss_(b, a);
printf("maxss %g, %g => %g\n", b, a, *(float*)&r);
a = -INFINITY;
r = _maxss_(a, b);
printf("maxss %g, %g => %g\n", a, b, *(float*)&r);
r = _maxss_(b, a);
printf("maxss %g, %g => %g\n", b, a, *(float*)&r);
a = +INFINITY;
r = _maxss_(a, b);
printf("maxss %g, %g => %g\n", a, b, *(float*)&r);
r = _maxss_(b, a);
printf("maxss %g, %g => %g\n", b, a, *(float*)&r);
a = NAN;
r = _maxss_(a, b);
printf("maxss %g, %g => %g\n", a, b, *(float*)&r);
r = _maxss_(b, a);
printf("maxss %g, %g => %g\n", b, a, *(float*)&r);
b = *(float*)&minf;
r = _maxss_(a, b);
printf("maxss %g, %g => %g\n", a, b, *(float*)&r);
r = _maxss_(b, a);
printf("maxss %g, %g => %g\n", b, a, *(float*)&r);
a = -INFINITY;
r = _maxss_(a, b);
printf("maxss %g, %g => %g\n", a, b, *(float*)&r);
r = _maxss_(b, a);
printf("maxss %g, %g => %g\n", b, a, *(float*)&r);
a = +INFINITY;
r = _maxss_(a, b);
printf("maxss %g, %g => %g\n", a, b, *(float*)&r);
r = _maxss_(b, a);
printf("maxss %g, %g => %g\n", b, a, *(float*)&r);
return 0;
}