The frsqrte and vrefp instructions produce an approximate result.
According to the ISA document for the POWER processor, the result will
vary in its precision for different processor implementations. This patch
fixes the masks to be applied to the results to remove the variability
in the results. The expected output files are also updated to reflect the
change in the result given the new masking of the result.
patch from Carl Love <cel@us.ibm.com>
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12720
302709 valgrind for ARM needs extra tls support for android emulator under Linux
302918 Enable testing of the vmaddfp and vnsubfp instructions in the testsuite
303116 Add support for the POWER instruction popcntb
+303127 Power test suite fixes for frsqrte, vrefp, and vrsqrtefp instructions.
Release 3.7.0 (5 November 2011)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
frsqrte 8000000000000000 => fff0000000000000
frsqrte 7ff0000000000000 => 0000000000000000
frsqrte fff0000000000000 => 7ff8000000000000
- frsqrte 7ff7ffffffffffff => 7fff800000000000
- frsqrte fff7ffffffffffff => ffff800000000000
+ frsqrte 7ff7ffffffffffff => 7fff000000000000
+ frsqrte fff7ffffffffffff => ffff000000000000
frsqrte 7ff8000000000000 => 7ff8000000000000
frsqrte fff8000000000000 => fff8000000000000
frsqrte. 8000000000000000 => fff0000000000000
frsqrte. 7ff0000000000000 => 0000000000000000
frsqrte. fff0000000000000 => 7ff8000000000000
- frsqrte. 7ff7ffffffffffff => 7fff800000000000
- frsqrte. fff7ffffffffffff => ffff800000000000
+ frsqrte. 7ff7ffffffffffff => 7fff000000000000
+ frsqrte. fff7ffffffffffff => ffff000000000000
frsqrte. 7ff8000000000000 => 7ff8000000000000
frsqrte. fff8000000000000 => fff8000000000000
static void test_frsqrte_ (void)
{
- __asm__ __volatile__ ("frsqrte. 17, 14");
+ __asm__ __volatile__ ("frsqrte. 17, 14");
}
static void test_frsp_ (void)
res = f17;
ur = *(uint64_t *)(&res);
+ if (strstr(name, " frsqrte") != NULL)
+ /* The 32-bit frsqrte instruction is the Floatig Reciprical Square
+ * Root Estimate instruction. The precision of the estimate will
+ * vary from Proceesor implementation. The approximation varies in
+ * bottom two bytes of the 32-bit result.
+ */
+ ur &= 0xFFFF000000000000ULL;
+
if (zap_hi_32bits)
ur &= 0x00000000FFFFFFFFULL;
if (zap_lo_44bits)
#endif
/* if we're doing an estimation operation, arrange to zap the
- bottom byte of the result as it's basically garbage, and differs
+ bottom 10-bits of the result as it's basically garbage, and differs
between cpus */
unsigned int mask
= (strstr(name,"vrsqrtefp") != NULL ||
strstr(name, "vrefp") != NULL)
- ? 0xFFFFFF00 : 0xFFFFFFFF;
+ ? 0xFFFFC000 : 0xFFFFFFFF;
for (i=0; i<nb_vfargs; i++) {
vec_in = (vector float)vfargs[i];
stvxl 7, f1f2f3f4 f5f6f7f8 f9fafbfc fefdfeff => f1f2f3f4 f5f6f7f8 f9fafbfc fefdfeff (00000000)
stvxl 14, f1f2f3f4 f5f6f7f8 f9fafbfc fefdfeff => f1f2f3f4 f5f6f7f8 f9fafbfc fefdfeff (00000000)
-Altivec floating point arith insns with three args:
Altivec floating point arith insns with two args:
vaddfp: 02bfffff02bfffff02bfffff02bfffff, 02bfffff02bfffff02bfffff02bfffff
vaddfp: => 033fffff 033fffff 033fffff 033fffff (00000000)
vrfim: => ffffffff ffffffff ffffffff ffffffff (00000000)
vrefp: 02bfffff 02bfffff 02bfffff 02bfffff
- vrefp: => 7c2aa900 7c2aa900 7c2aa900 7c2aa900 (00000000)
+ vrefp: => 7c2a8000 7c2a8000 7c2a8000 7c2a8000 (00000000)
vrefp: 513fffff 513fffff 513fffff 513fffff
- vrefp: => 2daaa900 2daaa900 2daaa900 2daaa900 (00000000)
+ vrefp: => 2daa8000 2daa8000 2daa8000 2daa8000 (00000000)
vrefp: 82bfffff 82bfffff 82bfffff 82bfffff
- vrefp: => fc2aa900 fc2aa900 fc2aa900 fc2aa900 (00000000)
+ vrefp: => fc2a8000 fc2a8000 fc2a8000 fc2a8000 (00000000)
vrefp: d13fffff d13fffff d13fffff d13fffff
- vrefp: => adaaa900 adaaa900 adaaa900 adaaa900 (00000000)
+ vrefp: => adaa8000 adaa8000 adaa8000 adaa8000 (00000000)
vrefp: 00000000 00000000 00000000 00000000
vrefp: => 7f800000 7f800000 7f800000 7f800000 (00000000)
vrefp: 80000000 80000000 80000000 80000000
vrefp: ff800000 ff800000 ff800000 ff800000
vrefp: => 80000000 80000000 80000000 80000000 (00000000)
vrefp: 7fffffff 7fffffff 7fffffff 7fffffff
- vrefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrefp: ffffffff ffffffff ffffffff ffffffff
- vrefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrefp: 7fbfffff 7fbfffff 7fbfffff 7fbfffff
- vrefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrefp: ffbfffff ffbfffff ffbfffff ffbfffff
- vrefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrsqrtefp: 02bfffff 02bfffff 02bfffff 02bfffff
- vrsqrtefp: => 5dd10300 5dd10300 5dd10300 5dd10300 (00000000)
+ vrsqrtefp: => 5dd10000 5dd10000 5dd10000 5dd10000 (00000000)
vrsqrtefp: 513fffff 513fffff 513fffff 513fffff
- vrsqrtefp: => 3693ca00 3693ca00 3693ca00 3693ca00 (00000000)
+ vrsqrtefp: => 3693c000 3693c000 3693c000 3693c000 (00000000)
vrsqrtefp: 82bfffff 82bfffff 82bfffff 82bfffff
vrsqrtefp: => 7fc00000 7fc00000 7fc00000 7fc00000 (00000000)
vrsqrtefp: d13fffff d13fffff d13fffff d13fffff
vrsqrtefp: ff800000 ff800000 ff800000 ff800000
vrsqrtefp: => 7fc00000 7fc00000 7fc00000 7fc00000 (00000000)
vrsqrtefp: 7fffffff 7fffffff 7fffffff 7fffffff
- vrsqrtefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrsqrtefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrsqrtefp: ffffffff ffffffff ffffffff ffffffff
- vrsqrtefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrsqrtefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrsqrtefp: 7fbfffff 7fbfffff 7fbfffff 7fbfffff
- vrsqrtefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrsqrtefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrsqrtefp: ffbfffff ffbfffff ffbfffff ffbfffff
- vrsqrtefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrsqrtefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
Altivec floating point compare insns:
vcmpgtfp: 02bfffff02bfffff02bfffff02bfffff, 02bfffff02bfffff02bfffff02bfffff
vrfim: => ffffffff ffffffff ffffffff ffffffff (00000000)
vrefp: 02bfffff 02bfffff 02bfffff 02bfffff
- vrefp: => 7c2aa900 7c2aa900 7c2aa900 7c2aa900 (00000000)
+ vrefp: => 7c2a8000 7c2a8000 7c2a8000 7c2a8000 (00000000)
vrefp: 513fffff 513fffff 513fffff 513fffff
- vrefp: => 2daaa900 2daaa900 2daaa900 2daaa900 (00000000)
+ vrefp: => 2daa8000 2daa8000 2daa8000 2daa8000 (00000000)
vrefp: 82bfffff 82bfffff 82bfffff 82bfffff
- vrefp: => fc2aa900 fc2aa900 fc2aa900 fc2aa900 (00000000)
+ vrefp: => fc2a8000 fc2a8000 fc2a8000 fc2a8000 (00000000)
vrefp: d13fffff d13fffff d13fffff d13fffff
- vrefp: => adaaa900 adaaa900 adaaa900 adaaa900 (00000000)
+ vrefp: => adaa8000 adaa8000 adaa8000 adaa8000 (00000000)
vrefp: 00000000 00000000 00000000 00000000
vrefp: => 7f800000 7f800000 7f800000 7f800000 (00000000)
vrefp: 80000000 80000000 80000000 80000000
vrefp: ff800000 ff800000 ff800000 ff800000
vrefp: => 80000000 80000000 80000000 80000000 (00000000)
vrefp: 7fffffff 7fffffff 7fffffff 7fffffff
- vrefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrefp: ffffffff ffffffff ffffffff ffffffff
- vrefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrefp: 7fbfffff 7fbfffff 7fbfffff 7fbfffff
- vrefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrefp: ffbfffff ffbfffff ffbfffff ffbfffff
- vrefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrsqrtefp: 02bfffff 02bfffff 02bfffff 02bfffff
- vrsqrtefp: => 5dd10300 5dd10300 5dd10300 5dd10300 (00000000)
+ vrsqrtefp: => 5dd10000 5dd10000 5dd10000 5dd10000 (00000000)
vrsqrtefp: 513fffff 513fffff 513fffff 513fffff
- vrsqrtefp: => 3693ca00 3693ca00 3693ca00 3693ca00 (00000000)
+ vrsqrtefp: => 3693c000 3693c000 3693c000 3693c000 (00000000)
vrsqrtefp: 82bfffff 82bfffff 82bfffff 82bfffff
vrsqrtefp: => 7fc00000 7fc00000 7fc00000 7fc00000 (00000000)
vrsqrtefp: d13fffff d13fffff d13fffff d13fffff
vrsqrtefp: ff800000 ff800000 ff800000 ff800000
vrsqrtefp: => 7fc00000 7fc00000 7fc00000 7fc00000 (00000000)
vrsqrtefp: 7fffffff 7fffffff 7fffffff 7fffffff
- vrsqrtefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrsqrtefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrsqrtefp: ffffffff ffffffff ffffffff ffffffff
- vrsqrtefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrsqrtefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrsqrtefp: 7fbfffff 7fbfffff 7fbfffff 7fbfffff
- vrsqrtefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrsqrtefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrsqrtefp: ffbfffff ffbfffff ffbfffff ffbfffff
- vrsqrtefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrsqrtefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
Altivec floating point compare insns:
vcmpgtfp: 02bfffff02bfffff02bfffff02bfffff, 02bfffff02bfffff02bfffff02bfffff
frsqrte 8000000000000000 => fff0000000000000
frsqrte 7ff0000000000000 => 0000000000000000
frsqrte fff0000000000000 => 7ff8000000000000
- frsqrte 7ff7ffffffffffff => 7fff800000000000
- frsqrte fff7ffffffffffff => ffff800000000000
+ frsqrte 7ff7ffffffffffff => 7fff000000000000
+ frsqrte fff7ffffffffffff => ffff000000000000
frsqrte 7ff8000000000000 => 7ff8000000000000
frsqrte fff8000000000000 => fff8000000000000
frsqrte. 8000000000000000 => fff0000000000000
frsqrte. 7ff0000000000000 => 0000000000000000
frsqrte. fff0000000000000 => 7ff8000000000000
- frsqrte. 7ff7ffffffffffff => 7fff800000000000
- frsqrte. fff7ffffffffffff => ffff800000000000
+ frsqrte. 7ff7ffffffffffff => 7fff000000000000
+ frsqrte. fff7ffffffffffff => ffff000000000000
frsqrte. 7ff8000000000000 => 7ff8000000000000
frsqrte. fff8000000000000 => fff8000000000000
stvxl 7, f1f2f3f4 f5f6f7f8 f9fafbfc fefdfeff => f1f2f3f4 f5f6f7f8 f9fafbfc fefdfeff (00000000)
stvxl 14, f1f2f3f4 f5f6f7f8 f9fafbfc fefdfeff => f1f2f3f4 f5f6f7f8 f9fafbfc fefdfeff (00000000)
-Altivec floating point arith insns with three args:
Altivec floating point arith insns with two args:
vaddfp: 02bfffff02bfffff02bfffff02bfffff, 02bfffff02bfffff02bfffff02bfffff
vaddfp: => 033fffff 033fffff 033fffff 033fffff (00000000)
vrfim: => ffffffff ffffffff ffffffff ffffffff (00000000)
vrefp: 02bfffff 02bfffff 02bfffff 02bfffff
- vrefp: => 7c2aa900 7c2aa900 7c2aa900 7c2aa900 (00000000)
+ vrefp: => 7c2a8000 7c2a8000 7c2a8000 7c2a8000 (00000000)
vrefp: 513fffff 513fffff 513fffff 513fffff
- vrefp: => 2daaa900 2daaa900 2daaa900 2daaa900 (00000000)
+ vrefp: => 2daa8000 2daa8000 2daa8000 2daa8000 (00000000)
vrefp: 82bfffff 82bfffff 82bfffff 82bfffff
- vrefp: => fc2aa900 fc2aa900 fc2aa900 fc2aa900 (00000000)
+ vrefp: => fc2a8000 fc2a8000 fc2a8000 fc2a8000 (00000000)
vrefp: d13fffff d13fffff d13fffff d13fffff
- vrefp: => adaaa900 adaaa900 adaaa900 adaaa900 (00000000)
+ vrefp: => adaa8000 adaa8000 adaa8000 adaa8000 (00000000)
vrefp: 00000000 00000000 00000000 00000000
vrefp: => 7f800000 7f800000 7f800000 7f800000 (00000000)
vrefp: 80000000 80000000 80000000 80000000
vrefp: ff800000 ff800000 ff800000 ff800000
vrefp: => 80000000 80000000 80000000 80000000 (00000000)
vrefp: 7fffffff 7fffffff 7fffffff 7fffffff
- vrefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrefp: ffffffff ffffffff ffffffff ffffffff
- vrefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrefp: 7fbfffff 7fbfffff 7fbfffff 7fbfffff
- vrefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrefp: ffbfffff ffbfffff ffbfffff ffbfffff
- vrefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrsqrtefp: 02bfffff 02bfffff 02bfffff 02bfffff
- vrsqrtefp: => 5dd10300 5dd10300 5dd10300 5dd10300 (00000000)
+ vrsqrtefp: => 5dd10000 5dd10000 5dd10000 5dd10000 (00000000)
vrsqrtefp: 513fffff 513fffff 513fffff 513fffff
- vrsqrtefp: => 3693ca00 3693ca00 3693ca00 3693ca00 (00000000)
+ vrsqrtefp: => 3693c000 3693c000 3693c000 3693c000 (00000000)
vrsqrtefp: 82bfffff 82bfffff 82bfffff 82bfffff
vrsqrtefp: => 7fc00000 7fc00000 7fc00000 7fc00000 (00000000)
vrsqrtefp: d13fffff d13fffff d13fffff d13fffff
vrsqrtefp: ff800000 ff800000 ff800000 ff800000
vrsqrtefp: => 7fc00000 7fc00000 7fc00000 7fc00000 (00000000)
vrsqrtefp: 7fffffff 7fffffff 7fffffff 7fffffff
- vrsqrtefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrsqrtefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrsqrtefp: ffffffff ffffffff ffffffff ffffffff
- vrsqrtefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrsqrtefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrsqrtefp: 7fbfffff 7fbfffff 7fbfffff 7fbfffff
- vrsqrtefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrsqrtefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrsqrtefp: ffbfffff ffbfffff ffbfffff ffbfffff
- vrsqrtefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrsqrtefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
Altivec floating point compare insns:
vcmpgtfp: 02bfffff02bfffff02bfffff02bfffff, 02bfffff02bfffff02bfffff02bfffff
vrfim: => ffffffff ffffffff ffffffff ffffffff (00000000)
vrefp: 02bfffff 02bfffff 02bfffff 02bfffff
- vrefp: => 7c2aa900 7c2aa900 7c2aa900 7c2aa900 (00000000)
+ vrefp: => 7c2a8000 7c2a8000 7c2a8000 7c2a8000 (00000000)
vrefp: 513fffff 513fffff 513fffff 513fffff
- vrefp: => 2daaa900 2daaa900 2daaa900 2daaa900 (00000000)
+ vrefp: => 2daa8000 2daa8000 2daa8000 2daa8000 (00000000)
vrefp: 82bfffff 82bfffff 82bfffff 82bfffff
- vrefp: => fc2aa900 fc2aa900 fc2aa900 fc2aa900 (00000000)
+ vrefp: => fc2a8000 fc2a8000 fc2a8000 fc2a8000 (00000000)
vrefp: d13fffff d13fffff d13fffff d13fffff
- vrefp: => adaaa900 adaaa900 adaaa900 adaaa900 (00000000)
+ vrefp: => adaa8000 adaa8000 adaa8000 adaa8000 (00000000)
vrefp: 00000000 00000000 00000000 00000000
vrefp: => 7f800000 7f800000 7f800000 7f800000 (00000000)
vrefp: 80000000 80000000 80000000 80000000
vrefp: ff800000 ff800000 ff800000 ff800000
vrefp: => 80000000 80000000 80000000 80000000 (00000000)
vrefp: 7fffffff 7fffffff 7fffffff 7fffffff
- vrefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrefp: ffffffff ffffffff ffffffff ffffffff
- vrefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrefp: 7fbfffff 7fbfffff 7fbfffff 7fbfffff
- vrefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrefp: ffbfffff ffbfffff ffbfffff ffbfffff
- vrefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrsqrtefp: 02bfffff 02bfffff 02bfffff 02bfffff
- vrsqrtefp: => 5dd10300 5dd10300 5dd10300 5dd10300 (00000000)
+ vrsqrtefp: => 5dd10000 5dd10000 5dd10000 5dd10000 (00000000)
vrsqrtefp: 513fffff 513fffff 513fffff 513fffff
- vrsqrtefp: => 3693ca00 3693ca00 3693ca00 3693ca00 (00000000)
+ vrsqrtefp: => 3693c000 3693c000 3693c000 3693c000 (00000000)
vrsqrtefp: 82bfffff 82bfffff 82bfffff 82bfffff
vrsqrtefp: => 7fc00000 7fc00000 7fc00000 7fc00000 (00000000)
vrsqrtefp: d13fffff d13fffff d13fffff d13fffff
vrsqrtefp: ff800000 ff800000 ff800000 ff800000
vrsqrtefp: => 7fc00000 7fc00000 7fc00000 7fc00000 (00000000)
vrsqrtefp: 7fffffff 7fffffff 7fffffff 7fffffff
- vrsqrtefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrsqrtefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrsqrtefp: ffffffff ffffffff ffffffff ffffffff
- vrsqrtefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrsqrtefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
vrsqrtefp: 7fbfffff 7fbfffff 7fbfffff 7fbfffff
- vrsqrtefp: => 7fffff00 7fffff00 7fffff00 7fffff00 (00000000)
+ vrsqrtefp: => 7fffc000 7fffc000 7fffc000 7fffc000 (00000000)
vrsqrtefp: ffbfffff ffbfffff ffbfffff ffbfffff
- vrsqrtefp: => ffffff00 ffffff00 ffffff00 ffffff00 (00000000)
+ vrsqrtefp: => ffffc000 ffffc000 ffffc000 ffffc000 (00000000)
Altivec floating point compare insns:
vcmpgtfp: 02bfffff02bfffff02bfffff02bfffff, 02bfffff02bfffff02bfffff02bfffff