|
From: Florian K. <fl...@ei...> - 2015-09-15 20:30:33
|
On 15.09.2015 21:55, Carl E. Love wrote:
> --- a/memcheck/tests/vbit-test/irops.c
> +++ b/memcheck/tests/vbit-test/irops.c
> @@ -1143,6 +1143,38 @@ get_irop(IROp op)
> return p->amd64 ? p : NULL;
> #endif
> #ifdef __powerpc__
> +#define MIN_POWER_ISA "../../../tests/min_power_isa"
> +
> + switch (op) {
> + case Iop_DivS64E:
> + case Iop_DivU64E:
> + case Iop_DivU32E:
> + case Iop_DivS32E:
> + case Iop_F64toI64U:
> + case Iop_F64toI32U:
> + case Iop_I64UtoF64:
> + case Iop_I64UtoF32:
> + case Iop_I64StoD64: {
> + int rc;
> + /* IROps require a processor that supports ISA 2.06 or newer */
> + rc = system(MIN_POWER_ISA " 2.06 ");
> + /* MIN_POWER_ISA returns 1 if underlying HW supports the
> + * specified ISA or newer.
> + */
> + if (rc == 0) return NULL;
> + if (rc > 2) {
> + fprintf(stderr,
> + " ERROR, min_power_isa() return code is invalid.\n");
> + exit(1);
util.c defines panic(const char *) which you could use here instead of
the fprintf for consistency.
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 708c28e..e3c51ab 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -1,6 +1,26 @@
>
> include $(top_srcdir)/Makefile.tool-tests.am
>
> +if HAS_ISA_2_05
> +ISA_2_05_FLAG = -DHAS_ISA_2_05
> +else
> +ISA_2_05_FLAG =
> +endif
> +
> +if HAS_ISA_2_06
> +ISA_2_06_FLAG = -DHAS_ISA_2_06
> +else
> +ISA_2_06_FLAG =
> +endif
> +
> +if HAS_ISA_2_07
> +ISA_2_07_FLAG = -DHAS_ISA_2_07
> +else
> +ISA_2_07_FLAG =
> +endif
> +
> +min_power_isa_FLAGS = $(HAS_ISA_2_05) $(HAS_ISA_2_06) $(HAS_ISA_2_07)
> +
> dist_noinst_SCRIPTS = \
> check_headers_and_includes \
> check_makefile_consistency \
> @@ -29,7 +49,8 @@ check_PROGRAMS = \
> s390x_features \
> mips_features \
> power_insn_available \
> - is_ppc64_BE
> + is_ppc64_BE \
> + min_power_isa
>
> AM_CFLAGS += $(AM_FLAG_M3264_PRI)
> AM_CXXFLAGS += $(AM_FLAG_M3264_PRI)
> @@ -40,3 +61,4 @@ else
> x86_amd64_features_CFLAGS = $(AM_CFLAGS)
> endif
>
> +min_power_isa_CFLAGS = $(min_power_isa_FLAGS)
> diff --git a/tests/min_power_isa.c b/tests/min_power_isa.c
> new file mode 100644
> index 0000000..6fed596
> --- /dev/null
> +++ b/tests/min_power_isa.c
> @@ -0,0 +1,67 @@
> +#include <stdio.h>
> +#include <stdbool.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <signal.h>
stdbool.h and signal.h are not needed.
> +
> +#define TRUE 1
> +#define FALSE 0
> +
> +/* main() */
> +int main(int argc, char **argv)
> +{
> + /* This program is passed in a minimum ISA that the underlying hardwre
> + * needs to support. If the HW supports this ISA or newer, return 1
> + * for true. Otherwise, return 0 for false. Return 2 for usage error.
> + */
> + int status;
> + char *min_isa;
> + int isa_level = 0;
> +
> + /* set the isa_level set by the Make */
> +#ifdef HWCAP_HAS_ISA_2_05
> + isa_level = 5;
> +#endif
> +
Hmm... The Makefile defines HAS_ISA_2_05 etc... not HWCAP_HAS_ISA_2_05
> + min_isa = argv[1];
> +
> + if (strcmp (min_isa, "2.05") == 0) {
> + if (isa_level >= 5) {
> + status = TRUE;
> + } else {
> + status = FALSE;
> + }
As a minor comment: you could simplify the control flow here:
if (strcmp (min_isa, "2.05") == 0)
return isa_level >= 5;
if (strcmp (min_isa, "2.06") == 0)
return isa_level >= 6;
and so on...
Florian
> +
> + } else if (strcmp (min_isa, "2.06") == 0) {
> + if (isa_level >= 6) {
> + status = TRUE;
> + } else {
> + status = FALSE;
> + }
> +
> + } else if (strcmp (min_isa, "2.07") == 0) {
> + if (isa_level >= 7) {
> + status = TRUE;
> + } else {
> + status = FALSE;
> + }
> +
> + } else {
> + status = FALSE;
> + }
> +
> + return status;
> +}
>
|