|
From: <sv...@va...> - 2006-04-01 23:06:36
|
Author: njn
Date: 2006-04-02 00:06:29 +0100 (Sun, 02 Apr 2006)
New Revision: 5808
Log:
Partial fix for the sh-mem.c failure on PPC32. This should make it work
on PPC32 now but break it on the other platforms. Julian will commit a
change to ensure the 32-bit floats are copied through the FP regs on all
platforms to make the broken ones work again.
Modified:
trunk/memcheck/tests/sh-mem.c
Modified: trunk/memcheck/tests/sh-mem.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/tests/sh-mem.c 2006-03-31 19:34:51 UTC (rev 5807)
+++ trunk/memcheck/tests/sh-mem.c 2006-04-01 23:06:29 UTC (rev 5808)
@@ -64,17 +64,17 @@
// Check that all the bytes in a[x..y-1] have their V byte equal to 'byt=
e'.
// 'str' and 'offset' are only used for printing an error message if
// something goes wrong.
-void check_all(U4 x, U4 y, U1 byte, char* str, int offset)
+void check_all(U4 x, U4 y, U1 expected_byte, char* str, int offset)
{
U1 sh[SZB_OF_a]; // Used for getting a[]'s V bits
int i;
=20
VALGRIND_GET_VBITS(a, sh, sizeof(a));
for (i =3D x; i < y; i++) {
- if ( byte !=3D sh[i] ) {
+ if ( expected_byte !=3D sh[i] ) {
fprintf(stderr, "\n\nFAILURE: %s, offset %d, byte %d -- "
"is 0x%x, should be 0x%x\n\n",
- str, offset, i, sh[i], byte);
+ str, offset, i, sh[i], expected_byte);
exit(1);
}
}
@@ -83,7 +83,7 @@
int main(void)
{
int h, i, j;
- U1 *undefA;
+ U1 *undefA, expected_byte;
=20
if (0 =3D=3D RUNNING_ON_VALGRIND) {
fprintf(stderr, "error: this program only works when run under Val=
grind\n");
@@ -125,7 +125,7 @@
// will be the same as 'Ty' if 'ITy' is an integer type). 'ITy' is u=
sed
// when doing shifting/masking and stuff like that.
=20
-#define DO(NNN, Ty, ITy) \
+#define DO(NNN, Ty, ITy, isF4) \
fprintf(stderr, "-- NNN: %d %s %s ------------------------\n", NNN, #=
Ty, #ITy); \
/* For all of the alignments from (0..NNN-1), eg. if NNN=3D=3D4, we d=
o */ \
/* alignments of 0, 1, 2, 3. */ \
@@ -164,16 +164,25 @@
undefN_Ty =3D (Ty*)&undefN_ITy; \
if (0 =3D=3D j % 32) fprintf(stderr, "%d...", j); /* progress m=
eter */ \
\
+ \
+ /* A nasty exception: all machines so far (x86/AMD64/PPC32/PPC6=
4)
+ * don't have 32-bit floats. So 32-bit floats get cast to 64-b=
it
+ * floats. Memcheck does a PCast in this case, which means tha=
t if
+ * any V bits for the 32-bit float are undefined (ie. 0 !=3D j)=
, all
+ * the V bits in the 64-bit float are undefined. So account fo=
r
+ * this when checking. */ \
+ expected_byte =3D ( (isF4 && 0 !=3D j) ? 0xff : j ); \
+ \
/* STOREVn. Note that we use the first element of the undefN_T=
y
* array, as explained above. */ \
for (i =3D 0; i < nN-1; i++) { aNb[i] =3D undefN_Ty[0]; } \
- check_all(h, n-NNN+h, j, "STOREVn", h); \
+ check_all(h, n-NNN+h, expected_byte, "STOREVn", h); \
\
/* LOADVn -- by copying the values to one place and then back,=20
* we ensure that LOADVn gets exercised. */ \
for (i =3D 0; i < nN-1; i++) { bNb[i] =3D aNb[i]; } \
for (i =3D 0; i < nN-1; i++) { aNb[i] =3D bNb[i]; } \
- check_all(h, n-NNN+h, j, "LOADVn", h); \
+ check_all(h, n-NNN+h, expected_byte, "LOADVn", h); \
} \
fprintf(stderr, "\n"); \
}
@@ -182,12 +191,12 @@
// reason being that on 32-bit machines just using integer types neve=
r
// exercises LOADV8/STOREV8 -- for integer types these loads/stores g=
et
// broken into two 32-bit loads/stores.
- DO(1, U1, U1);
- DO(2, U2, U2);
- DO(4, U4, U4);
- DO(4, F4, U4);
- DO(8, U8, U8);
- DO(8, F8, U8);
+ DO(1, U1, U1, /*isF4*/0);
+ DO(2, U2, U2, /*isF4*/0);
+ DO(4, U4, U4, /*isF4*/0);
+ DO(4, F4, U4, /*isF4*/1);
+ DO(8, U8, U8, /*isF4*/0);
+ DO(8, F8, U8, /*isF4*/0);
=20
return 0;
}
|