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