diff mbox series

[1/9] Hexagon (target/hexagon) Add support for v68/v69/v71/v73

Message ID 20230426023018.1742266-2-tsimpson@quicinc.com (mailing list archive)
State New, archived
Headers show
Series Hexagon (target/hexagon) New architecture support | expand

Commit Message

Taylor Simpson April 26, 2023, 2:30 a.m. UTC
Add support for the ELF flags
Move target/hexagon/cpu.[ch] to be v73
Change the compiler flag used by "make check-tcg"

The decbin instruction is removed in Hexagon v73, so check the
version before trying to compile the instruction.

Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
---
 configure                         |  2 +-
 linux-user/hexagon/target_elf.h   | 13 +++++++++----
 target/hexagon/cpu.h              |  4 ++++
 target/hexagon/cpu.c              | 20 ++++++++++++++++++++
 tests/tcg/hexagon/misc.c          | 12 ++++++++++++
 tests/tcg/hexagon/Makefile.target |  3 +++
 6 files changed, 49 insertions(+), 5 deletions(-)

Comments

Gao,Shiyuan" via April 26, 2023, 6:06 p.m. UTC | #1
On 4/26/23 04:30, Taylor Simpson wrote:
> Add support for the ELF flags
> Move target/hexagon/cpu.[ch] to be v73
> Change the compiler flag used by "make check-tcg"
>
> The decbin instruction is removed in Hexagon v73, so check the
> version before trying to compile the instruction.
>
> Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
> ---
>   configure                         |  2 +-
>   linux-user/hexagon/target_elf.h   | 13 +++++++++----
>   target/hexagon/cpu.h              |  4 ++++
>   target/hexagon/cpu.c              | 20 ++++++++++++++++++++
>   tests/tcg/hexagon/misc.c          | 12 ++++++++++++
>   tests/tcg/hexagon/Makefile.target |  3 +++
>   6 files changed, 49 insertions(+), 5 deletions(-)
>
> diff --git a/configure b/configure
> index 77c03315f8..01fa77f6c7 100755
> --- a/configure
> +++ b/configure
> @@ -1857,7 +1857,7 @@ fi
>   : ${cross_cc_armeb="$cross_cc_arm"}
>   : ${cross_cc_cflags_armeb="-mbig-endian"}
>   : ${cross_cc_hexagon="hexagon-unknown-linux-musl-clang"}
> -: ${cross_cc_cflags_hexagon="-mv67 -O2 -static"}
> +: ${cross_cc_cflags_hexagon="-mv73 -O2 -static"}
>   : ${cross_cc_cflags_i386="-m32"}
>   : ${cross_cc_cflags_ppc="-m32 -mbig-endian"}
>   : ${cross_cc_cflags_ppc64="-m64 -mbig-endian"}
> diff --git a/linux-user/hexagon/target_elf.h b/linux-user/hexagon/target_elf.h
> index b4e9f40527..a0271a0a2a 100644
> --- a/linux-user/hexagon/target_elf.h
> +++ b/linux-user/hexagon/target_elf.h
> @@ -1,5 +1,5 @@
>   /*
> - *  Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
> + *  Copyright(c) 2019-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
>    *
>    *  This program is free software; you can redistribute it and/or modify
>    *  it under the terms of the GNU General Public License as published by
> @@ -20,7 +20,7 @@
>   
>   static inline const char *cpu_get_model(uint32_t eflags)
>   {
> -    /* For now, treat anything newer than v5 as a v67 */
> +    /* For now, treat anything newer than v5 as a v73 */
>       /* FIXME - Disable instructions that are newer than the specified arch */
>       if (eflags == 0x04 ||    /* v5  */
>           eflags == 0x05 ||    /* v55 */
> @@ -30,9 +30,14 @@ static inline const char *cpu_get_model(uint32_t eflags)
>           eflags == 0x65 ||    /* v65 */
>           eflags == 0x66 ||    /* v66 */
>           eflags == 0x67 ||    /* v67 */
> -        eflags == 0x8067     /* v67t */
> +        eflags == 0x8067 ||  /* v67t */
> +        eflags == 0x68 ||    /* v68 */
> +        eflags == 0x69 ||    /* v69 */
> +        eflags == 0x71 ||    /* v71 */
> +        eflags == 0x8071 ||  /* v71t */
> +        eflags == 0x73       /* v73 */
>          ) {
> -        return "v67";
> +        return "v73";
>       }
>       return "unknown";
>   }
> diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
> index 81b663ecfb..4d8981d862 100644
> --- a/target/hexagon/cpu.h
> +++ b/target/hexagon/cpu.h
> @@ -43,6 +43,10 @@
>   #define CPU_RESOLVING_TYPE TYPE_HEXAGON_CPU
>   
>   #define TYPE_HEXAGON_CPU_V67 HEXAGON_CPU_TYPE_NAME("v67")
> +#define TYPE_HEXAGON_CPU_V68 HEXAGON_CPU_TYPE_NAME("v68")
> +#define TYPE_HEXAGON_CPU_V69 HEXAGON_CPU_TYPE_NAME("v69")
> +#define TYPE_HEXAGON_CPU_V71 HEXAGON_CPU_TYPE_NAME("v71")
> +#define TYPE_HEXAGON_CPU_V73 HEXAGON_CPU_TYPE_NAME("v73")
>   
>   #define MMU_USER_IDX 0
>   
> diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
> index ab40cfc283..8699db8c24 100644
> --- a/target/hexagon/cpu.c
> +++ b/target/hexagon/cpu.c
> @@ -29,6 +29,22 @@ static void hexagon_v67_cpu_init(Object *obj)
>   {
>   }
>   
> +static void hexagon_v68_cpu_init(Object *obj)
> +{
> +}
> +
> +static void hexagon_v69_cpu_init(Object *obj)
> +{
> +}
> +
> +static void hexagon_v71_cpu_init(Object *obj)
> +{
> +}
> +
> +static void hexagon_v73_cpu_init(Object *obj)
> +{
> +}
> +
>   static ObjectClass *hexagon_cpu_class_by_name(const char *cpu_model)
>   {
>       ObjectClass *oc;
> @@ -382,6 +398,10 @@ static const TypeInfo hexagon_cpu_type_infos[] = {
>           .class_init = hexagon_cpu_class_init,
>       },
>       DEFINE_CPU(TYPE_HEXAGON_CPU_V67,              hexagon_v67_cpu_init),
> +    DEFINE_CPU(TYPE_HEXAGON_CPU_V68,              hexagon_v68_cpu_init),
> +    DEFINE_CPU(TYPE_HEXAGON_CPU_V69,              hexagon_v69_cpu_init),
> +    DEFINE_CPU(TYPE_HEXAGON_CPU_V71,              hexagon_v71_cpu_init),
> +    DEFINE_CPU(TYPE_HEXAGON_CPU_V73,              hexagon_v73_cpu_init),

The large spacing to hexagon_v*_cpu_init looks a bit odd.

Also, do we need to provide a *_cpu_init() stub for each version? Seems 
from qom/object.c like we should be able to
just default initialize it

Otherwise,

Reviewed-by: Anton Johansson <anjo@rev.ng>
Taylor Simpson April 26, 2023, 8:27 p.m. UTC | #2
> -----Original Message-----
> From: Anton Johansson <anjo@rev.ng>
> Sent: Wednesday, April 26, 2023 1:06 PM
> To: Taylor Simpson <tsimpson@quicinc.com>; qemu-devel@nongnu.org
> Cc: richard.henderson@linaro.org; philmd@linaro.org; ale@rev.ng; Brian Cain
> <bcain@quicinc.com>; Matheus Bernardino (QUIC)
> <quic_mathbern@quicinc.com>
> Subject: Re: [PATCH 1/9] Hexagon (target/hexagon) Add support for
> v68/v69/v71/v73
> 
> On 4/26/23 04:30, Taylor Simpson wrote:
> > diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c index
> > ab40cfc283..8699db8c24 100644
> > --- a/target/hexagon/cpu.c
> > +++ b/target/hexagon/cpu.c
> > @@ -29,6 +29,22 @@ static void hexagon_v67_cpu_init(Object *obj)
> >   {
> >   }
> >
> > +static void hexagon_v68_cpu_init(Object *obj) { }
> > +
> > +static void hexagon_v69_cpu_init(Object *obj) { }
> > +
> > +static void hexagon_v71_cpu_init(Object *obj) { }
> > +
> > +static void hexagon_v73_cpu_init(Object *obj) { }
> > +
> >   static ObjectClass *hexagon_cpu_class_by_name(const char
> *cpu_model)
> >   {
> >       ObjectClass *oc;
> > @@ -382,6 +398,10 @@ static const TypeInfo hexagon_cpu_type_infos[] =
> {
> >           .class_init = hexagon_cpu_class_init,
> >       },
> >       DEFINE_CPU(TYPE_HEXAGON_CPU_V67,
> hexagon_v67_cpu_init),
> > +    DEFINE_CPU(TYPE_HEXAGON_CPU_V68,
> hexagon_v68_cpu_init),
> > +    DEFINE_CPU(TYPE_HEXAGON_CPU_V69,
> hexagon_v69_cpu_init),
> > +    DEFINE_CPU(TYPE_HEXAGON_CPU_V71,
> hexagon_v71_cpu_init),
> > +    DEFINE_CPU(TYPE_HEXAGON_CPU_V73,
> hexagon_v73_cpu_init),
> 
> The large spacing to hexagon_v*_cpu_init looks a bit odd.

I'll put them each on a single line with no line in between.

> 
> Also, do we need to provide a *_cpu_init() stub for each version? Seems
> from qom/object.c like we should be able to just default initialize it

I could point them all to a single function, but at some point, we'll want to execute only the instructions that are available an the specified version of the core.

> 
> Otherwise,
> 
> Reviewed-by: Anton Johansson <anjo@rev.ng>
diff mbox series

Patch

diff --git a/configure b/configure
index 77c03315f8..01fa77f6c7 100755
--- a/configure
+++ b/configure
@@ -1857,7 +1857,7 @@  fi
 : ${cross_cc_armeb="$cross_cc_arm"}
 : ${cross_cc_cflags_armeb="-mbig-endian"}
 : ${cross_cc_hexagon="hexagon-unknown-linux-musl-clang"}
-: ${cross_cc_cflags_hexagon="-mv67 -O2 -static"}
+: ${cross_cc_cflags_hexagon="-mv73 -O2 -static"}
 : ${cross_cc_cflags_i386="-m32"}
 : ${cross_cc_cflags_ppc="-m32 -mbig-endian"}
 : ${cross_cc_cflags_ppc64="-m64 -mbig-endian"}
diff --git a/linux-user/hexagon/target_elf.h b/linux-user/hexagon/target_elf.h
index b4e9f40527..a0271a0a2a 100644
--- a/linux-user/hexagon/target_elf.h
+++ b/linux-user/hexagon/target_elf.h
@@ -1,5 +1,5 @@ 
 /*
- *  Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
+ *  Copyright(c) 2019-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@ 
 
 static inline const char *cpu_get_model(uint32_t eflags)
 {
-    /* For now, treat anything newer than v5 as a v67 */
+    /* For now, treat anything newer than v5 as a v73 */
     /* FIXME - Disable instructions that are newer than the specified arch */
     if (eflags == 0x04 ||    /* v5  */
         eflags == 0x05 ||    /* v55 */
@@ -30,9 +30,14 @@  static inline const char *cpu_get_model(uint32_t eflags)
         eflags == 0x65 ||    /* v65 */
         eflags == 0x66 ||    /* v66 */
         eflags == 0x67 ||    /* v67 */
-        eflags == 0x8067     /* v67t */
+        eflags == 0x8067 ||  /* v67t */
+        eflags == 0x68 ||    /* v68 */
+        eflags == 0x69 ||    /* v69 */
+        eflags == 0x71 ||    /* v71 */
+        eflags == 0x8071 ||  /* v71t */
+        eflags == 0x73       /* v73 */
        ) {
-        return "v67";
+        return "v73";
     }
     return "unknown";
 }
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
index 81b663ecfb..4d8981d862 100644
--- a/target/hexagon/cpu.h
+++ b/target/hexagon/cpu.h
@@ -43,6 +43,10 @@ 
 #define CPU_RESOLVING_TYPE TYPE_HEXAGON_CPU
 
 #define TYPE_HEXAGON_CPU_V67 HEXAGON_CPU_TYPE_NAME("v67")
+#define TYPE_HEXAGON_CPU_V68 HEXAGON_CPU_TYPE_NAME("v68")
+#define TYPE_HEXAGON_CPU_V69 HEXAGON_CPU_TYPE_NAME("v69")
+#define TYPE_HEXAGON_CPU_V71 HEXAGON_CPU_TYPE_NAME("v71")
+#define TYPE_HEXAGON_CPU_V73 HEXAGON_CPU_TYPE_NAME("v73")
 
 #define MMU_USER_IDX 0
 
diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
index ab40cfc283..8699db8c24 100644
--- a/target/hexagon/cpu.c
+++ b/target/hexagon/cpu.c
@@ -29,6 +29,22 @@  static void hexagon_v67_cpu_init(Object *obj)
 {
 }
 
+static void hexagon_v68_cpu_init(Object *obj)
+{
+}
+
+static void hexagon_v69_cpu_init(Object *obj)
+{
+}
+
+static void hexagon_v71_cpu_init(Object *obj)
+{
+}
+
+static void hexagon_v73_cpu_init(Object *obj)
+{
+}
+
 static ObjectClass *hexagon_cpu_class_by_name(const char *cpu_model)
 {
     ObjectClass *oc;
@@ -382,6 +398,10 @@  static const TypeInfo hexagon_cpu_type_infos[] = {
         .class_init = hexagon_cpu_class_init,
     },
     DEFINE_CPU(TYPE_HEXAGON_CPU_V67,              hexagon_v67_cpu_init),
+    DEFINE_CPU(TYPE_HEXAGON_CPU_V68,              hexagon_v68_cpu_init),
+    DEFINE_CPU(TYPE_HEXAGON_CPU_V69,              hexagon_v69_cpu_init),
+    DEFINE_CPU(TYPE_HEXAGON_CPU_V71,              hexagon_v71_cpu_init),
+    DEFINE_CPU(TYPE_HEXAGON_CPU_V73,              hexagon_v73_cpu_init),
 };
 
 DEFINE_TYPES(hexagon_cpu_type_infos)
diff --git a/tests/tcg/hexagon/misc.c b/tests/tcg/hexagon/misc.c
index e126751e3a..4fcbb22795 100644
--- a/tests/tcg/hexagon/misc.c
+++ b/tests/tcg/hexagon/misc.c
@@ -18,6 +18,8 @@ 
 #include <stdio.h>
 #include <string.h>
 
+#define CORE_HAS_CABAC            (__HEXAGON_ARCH__ <= 71)
+
 typedef unsigned char uint8_t;
 typedef unsigned short uint16_t;
 typedef unsigned int uint32_t;
@@ -245,6 +247,7 @@  static void check(int val, int expect)
     }
 }
 
+#if CORE_HAS_CABAC
 static void check64(long long val, long long expect)
 {
     if (val != expect) {
@@ -252,6 +255,7 @@  static void check64(long long val, long long expect)
         err++;
     }
 }
+#endif
 
 uint32_t init[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 uint32_t array[10];
@@ -286,6 +290,7 @@  static long long creg_pair(int x, int y)
     return retval;
 }
 
+#if CORE_HAS_CABAC
 static long long decbin(long long x, long long y, int *pred)
 {
     long long retval;
@@ -295,6 +300,7 @@  static long long decbin(long long x, long long y, int *pred)
          : "r"(x), "r"(y));
     return retval;
 }
+#endif
 
 /* Check that predicates are auto-and'ed in a packet */
 static int auto_and(void)
@@ -388,8 +394,10 @@  void test_count_trailing_zeros_ones(void)
 int main()
 {
     int res;
+#if CORE_HAS_CABAC
     long long res64;
     int pred;
+#endif
 
     memcpy(array, init, sizeof(array));
     S4_storerhnew_rr(array, 4, 0xffff);
@@ -505,6 +513,7 @@  int main()
     res = test_clrtnew(2, 7);
     check(res, 7);
 
+#if CORE_HAS_CABAC
     res64 = decbin(0xf0f1f2f3f4f5f6f7LL, 0x7f6f5f4f3f2f1f0fLL, &pred);
     check64(res64, 0x357980003700010cLL);
     check(pred, 0);
@@ -512,6 +521,9 @@  int main()
     res64 = decbin(0xfLL, 0x1bLL, &pred);
     check64(res64, 0x78000100LL);
     check(pred, 1);
+#else
+    puts("Skipping cabac tests");
+#endif
 
     res = auto_and();
     check(res, 0);
diff --git a/tests/tcg/hexagon/Makefile.target b/tests/tcg/hexagon/Makefile.target
index 7c94db4bc4..59b1b074e9 100644
--- a/tests/tcg/hexagon/Makefile.target
+++ b/tests/tcg/hexagon/Makefile.target
@@ -82,6 +82,9 @@  TESTS += $(HEX_TESTS)
 usr: usr.c
 	$(CC) $(CFLAGS) -mv67t -O2 -Wno-inline-asm -Wno-expansion-to-defined $< -o $@ $(LDFLAGS)
 
+# Build this test with -mv71 to exercise the CABAC instruction
+misc: misc.c
+	$(CC) $(CFLAGS) -mv71 -O2 $< -o $@ $(LDFLAGS)
 scatter_gather: CFLAGS += -mhvx
 vector_add_int: CFLAGS += -mhvx -fvectorize
 hvx_misc: hvx_misc.c hvx_misc.h