Based on a patch by Maynard Johnson <maynardj@us.ibm.com>.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11857
fcmpu fff8000000000000, fff8000000000000 => fff8000000000000
PPC floating point arith insns with one arg:
+ fres 0010000000000001 => 7ff0000000000000
+ fres 00100094e0000359 => 7ff0000000000000
+ fres 3fe0000000000001 => 4000000000000000
+ fres 3fe00094e0000359 => 3ffff00000000000
+ fres 8010000000000001 => fff0000000000000
+ fres 80100094e0000359 => fff0000000000000
+ fres bfe0000000000001 => c000000000000000
+ fres bfe00094e0000359 => bffff00000000000
+ fres 0000000000000000 => 7ff0000000000000
+ fres 8000000000000000 => fff0000000000000
+ fres 7ff0000000000000 => 0000000000000000
+ fres fff0000000000000 => 8000000000000000
+ fres 7ff7ffffffffffff => 7ffff00000000000
+ fres fff7ffffffffffff => fffff00000000000
+ fres 7ff8000000000000 => 7ff8000000000000
+ fres fff8000000000000 => fff8000000000000
+
+ frsqrte 0010000000000001 => 5fdf000000000000
+ frsqrte 00100094e0000359 => 5fdf000000000000
+ frsqrte 3fe0000000000001 => 3ff6000000000000
+ frsqrte 3fe00094e0000359 => 3ff6000000000000
+ frsqrte 8010000000000001 => 7ff8000000000000
+ frsqrte 80100094e0000359 => 7ff8000000000000
+ frsqrte bfe0000000000001 => 7ff8000000000000
+ frsqrte bfe00094e0000359 => 7ff8000000000000
+ frsqrte 0000000000000000 => 7ff0000000000000
+ frsqrte 8000000000000000 => fff0000000000000
+ frsqrte 7ff0000000000000 => 0000000000000000
+ frsqrte fff0000000000000 => 7ff8000000000000
+ frsqrte 7ff7ffffffffffff => 7fff800000000000
+ frsqrte fff7ffffffffffff => ffff800000000000
+ frsqrte 7ff8000000000000 => 7ff8000000000000
+ frsqrte fff8000000000000 => fff8000000000000
+
frsp 0010000000000001 => 0000000000000000
frsp 00100094e0000359 => 0000000000000000
frsp 3fe0000000000001 => 3fe0000000000000
PPC floating point arith insns
with one arg with flags update:
+ fres. 0010000000000001 => 7ff0000000000000
+ fres. 00100094e0000359 => 7ff0000000000000
+ fres. 3fe0000000000001 => 4000000000000000
+ fres. 3fe00094e0000359 => 3ffff00000000000
+ fres. 8010000000000001 => fff0000000000000
+ fres. 80100094e0000359 => fff0000000000000
+ fres. bfe0000000000001 => c000000000000000
+ fres. bfe00094e0000359 => bffff00000000000
+ fres. 0000000000000000 => 7ff0000000000000
+ fres. 8000000000000000 => fff0000000000000
+ fres. 7ff0000000000000 => 0000000000000000
+ fres. fff0000000000000 => 8000000000000000
+ fres. 7ff7ffffffffffff => 7ffff00000000000
+ fres. fff7ffffffffffff => fffff00000000000
+ fres. 7ff8000000000000 => 7ff8000000000000
+ fres. fff8000000000000 => fff8000000000000
+
+ frsqrte. 0010000000000001 => 5fdf000000000000
+ frsqrte. 00100094e0000359 => 5fdf000000000000
+ frsqrte. 3fe0000000000001 => 3ff6000000000000
+ frsqrte. 3fe00094e0000359 => 3ff6000000000000
+ frsqrte. 8010000000000001 => 7ff8000000000000
+ frsqrte. 80100094e0000359 => 7ff8000000000000
+ frsqrte. bfe0000000000001 => 7ff8000000000000
+ frsqrte. bfe00094e0000359 => 7ff8000000000000
+ frsqrte. 0000000000000000 => 7ff0000000000000
+ frsqrte. 8000000000000000 => fff0000000000000
+ frsqrte. 7ff0000000000000 => 0000000000000000
+ frsqrte. fff0000000000000 => 7ff8000000000000
+ frsqrte. 7ff7ffffffffffff => 7fff800000000000
+ frsqrte. fff7ffffffffffff => ffff800000000000
+ frsqrte. 7ff8000000000000 => 7ff8000000000000
+ frsqrte. fff8000000000000 => fff8000000000000
+
frsp. 0010000000000001 => 0000000000000000
frsp. 00100094e0000359 => 0000000000000000
frsp. 3fe0000000000001 => 3fe0000000000000
stfdux 7ff8000000000000, 112 => 7ff8000000000000, 112
stfdux fff8000000000000, 120 => fff8000000000000, 120
-All done. Tested 67 different instructions
+All done. Tested 71 different instructions
#if !defined (NO_FLOAT)
-#if 0 // TODO: Not yet supported
static void test_fres (void)
{
__asm__ __volatile__ ("fres 17, 14");
{
__asm__ __volatile__ ("frsqrte 17, 14");
}
-#endif
static void test_frsp (void)
{
#endif // #ifdef __powerpc64__
static test_t tests_fa_ops_one[] = {
- // { &test_fres , " fres", }, // TODO: Not yet supported
- // { &test_frsqrte , " frsqrte", }, // TODO: Not yet supported
+ { &test_fres , " fres", },
+ { &test_frsqrte , " frsqrte", },
{ &test_frsp , " frsp", },
{ &test_fctiw , " fctiw", },
{ &test_fctiwz , " fctiwz", },
#if !defined (NO_FLOAT)
-#if 0 // TODO: Not yet supported
static void test_fres_ (void)
{
__asm__ __volatile__ ("fres. 17, 14");
{
__asm__ __volatile__ ("frsqrte. 17, 14");
}
-#endif
static void test_frsp_ (void)
{
#endif // #ifdef __powerpc64__
static test_t tests_far_ops_one[] = {
- // { &test_fres_ , " fres.", }, // TODO: Not yet supported
- // { &test_frsqrte_ , " frsqrte.", }, // TODO: Not yet supported
+ { &test_fres_ , " fres.", },
+ { &test_frsqrte_ , " frsqrte.", },
{ &test_frsp_ , " frsp.", },
{ &test_fctiw_ , " fctiw.", },
{ &test_fctiwz_ , " fctiwz.", },
double res;
uint64_t u0, ur;
volatile uint32_t flags;
- int i, zap_hi_32bits;
+ int i;
+ unsigned zap_hi_32bits, zap_lo_44bits, zap_lo_47bits;
/* if we're testing fctiw or fctiwz, zap the hi 32bits,
as they're undefined */
- zap_hi_32bits = strstr(name, "fctiw") != NULL;
+ zap_hi_32bits = strstr(name, " fctiw") != NULL ? 1 : 0;
+ zap_lo_44bits = strstr(name, " fres") != NULL ? 1 : 0;
+ zap_lo_47bits = strstr(name, " frsqrte") != NULL ? 1 : 0;
+
+ assert(zap_hi_32bits + zap_lo_44bits + zap_lo_47bits <= 1);
for (i=0; i<nb_fargs; i++) {
u0 = *(uint64_t *)(&fargs[i]);
ur = *(uint64_t *)(&res);
if (zap_hi_32bits)
- ur &= 0xFFFFFFFFULL;
+ ur &= 0x00000000FFFFFFFFULL;
+ if (zap_lo_44bits)
+ ur &= 0xFFFFF00000000000ULL;
+ if (zap_lo_47bits)
+ ur &= 0xFFFF800000000000ULL;
#ifndef __powerpc64__
printf("%s %016llx => %016llx",
fcmpu fff8000000000000, fff8000000000000 => fff8000000000000
PPC floating point arith insns with one arg:
+ fres 0010000000000001 => 7ff0000000000000
+ fres 00100094e0000359 => 7ff0000000000000
+ fres 3fe0000000000001 => 4000000000000000
+ fres 3fe00094e0000359 => 3ffff00000000000
+ fres 8010000000000001 => fff0000000000000
+ fres 80100094e0000359 => fff0000000000000
+ fres bfe0000000000001 => c000000000000000
+ fres bfe00094e0000359 => bffff00000000000
+ fres 0000000000000000 => 7ff0000000000000
+ fres 8000000000000000 => fff0000000000000
+ fres 7ff0000000000000 => 0000000000000000
+ fres fff0000000000000 => 8000000000000000
+ fres 7ff7ffffffffffff => 7ffff00000000000
+ fres fff7ffffffffffff => fffff00000000000
+ fres 7ff8000000000000 => 7ff8000000000000
+ fres fff8000000000000 => fff8000000000000
+
+ frsqrte 0010000000000001 => 5fdf000000000000
+ frsqrte 00100094e0000359 => 5fdf000000000000
+ frsqrte 3fe0000000000001 => 3ff6000000000000
+ frsqrte 3fe00094e0000359 => 3ff6000000000000
+ frsqrte 8010000000000001 => 7ff8000000000000
+ frsqrte 80100094e0000359 => 7ff8000000000000
+ frsqrte bfe0000000000001 => 7ff8000000000000
+ frsqrte bfe00094e0000359 => 7ff8000000000000
+ frsqrte 0000000000000000 => 7ff0000000000000
+ frsqrte 8000000000000000 => fff0000000000000
+ frsqrte 7ff0000000000000 => 0000000000000000
+ frsqrte fff0000000000000 => 7ff8000000000000
+ frsqrte 7ff7ffffffffffff => 7fff800000000000
+ frsqrte fff7ffffffffffff => ffff800000000000
+ frsqrte 7ff8000000000000 => 7ff8000000000000
+ frsqrte fff8000000000000 => fff8000000000000
+
frsp 0010000000000001 => 0000000000000000
frsp 00100094e0000359 => 0000000000000000
frsp 3fe0000000000001 => 3fe0000000000000
PPC floating point arith insns
with one arg with flags update:
+ fres. 0010000000000001 => 7ff0000000000000
+ fres. 00100094e0000359 => 7ff0000000000000
+ fres. 3fe0000000000001 => 4000000000000000
+ fres. 3fe00094e0000359 => 3ffff00000000000
+ fres. 8010000000000001 => fff0000000000000
+ fres. 80100094e0000359 => fff0000000000000
+ fres. bfe0000000000001 => c000000000000000
+ fres. bfe00094e0000359 => bffff00000000000
+ fres. 0000000000000000 => 7ff0000000000000
+ fres. 8000000000000000 => fff0000000000000
+ fres. 7ff0000000000000 => 0000000000000000
+ fres. fff0000000000000 => 8000000000000000
+ fres. 7ff7ffffffffffff => 7ffff00000000000
+ fres. fff7ffffffffffff => fffff00000000000
+ fres. 7ff8000000000000 => 7ff8000000000000
+ fres. fff8000000000000 => fff8000000000000
+
+ frsqrte. 0010000000000001 => 5fdf000000000000
+ frsqrte. 00100094e0000359 => 5fdf000000000000
+ frsqrte. 3fe0000000000001 => 3ff6000000000000
+ frsqrte. 3fe00094e0000359 => 3ff6000000000000
+ frsqrte. 8010000000000001 => 7ff8000000000000
+ frsqrte. 80100094e0000359 => 7ff8000000000000
+ frsqrte. bfe0000000000001 => 7ff8000000000000
+ frsqrte. bfe00094e0000359 => 7ff8000000000000
+ frsqrte. 0000000000000000 => 7ff0000000000000
+ frsqrte. 8000000000000000 => fff0000000000000
+ frsqrte. 7ff0000000000000 => 0000000000000000
+ frsqrte. fff0000000000000 => 7ff8000000000000
+ frsqrte. 7ff7ffffffffffff => 7fff800000000000
+ frsqrte. fff7ffffffffffff => ffff800000000000
+ frsqrte. 7ff8000000000000 => 7ff8000000000000
+ frsqrte. fff8000000000000 => fff8000000000000
+
frsp. 0010000000000001 => 0000000000000000
frsp. 00100094e0000359 => 0000000000000000
frsp. 3fe0000000000001 => 3fe0000000000000
stfdux 7ff8000000000000, 112 => 7ff8000000000000, 112
stfdux fff8000000000000, 120 => fff8000000000000, 120
-All done. Tested 73 different instructions
+All done. Tested 77 different instructions