Hi,

I don't know how I missed the original email...

Looks good to me, but it misses a test, can you make a test, something
like an inline asm with a code density instruction, and
-mno-code-density command passed to the compiler? The assembler should
choke on the inline assembler instruction.

Cheers,
Claudiu

On Fri, Sep 11, 2026 at 12:57 PM Michiel Derhaeg <[email protected]> wrote:
>
> Ping
>
> Michiel Derhaeg <[email protected]> writes:
>
> > From: Luis Silva <[email protected]>
> >
> > For ARC EM CPUs that enable code density by default, the driver adds
> > -mcode-density to the assembler command line.  When the user passes
> > -mno-code-density, the compiler disables the extension, but the driver
> > still passes -mcode-density to the assembler for those CPUs.
> >
> > For example, with -mcpu=em4_dmips the driver invokes the assembler as:
> >
> >       gcc ... -mcpu=em4_dmips -c test.c
> >       -> as ... -mcpu=arcem -mcode-density ...
> >
> > With -mno-code-density, it used to make no difference:
> >
> >       gcc ... -mcpu=em4_dmips -mno-code-density -c test.c
> >       -> as ... -mcpu=arcem -mcode-density ...
> >
> > and now correctly omits -mcode-density:
> >
> >       gcc ... -mcpu=em4_dmips -mno-code-density -c test.c
> >       -> as ... -mcpu=arcem ...
> >
> > Assembling the same test program shows different instruction encodings
> > in the object file, for example:
> >
> >       $ gcc -c test.c -mcpu=em4_dmips
> >       $ objdump -d test.o
> >          4:   4104                    ld_s    r1,[r0,0]
> >         10:   4004                    ld_s    r0,[r0,0]
> >
> > versus:
> >
> >       $ gcc -c test.c -mcpu=em4_dmips -mno-code-density
> >       $ objdump -d test.o
> >          4:   8020                    ld_s    r1,[r0,0]
> >         10:   8000                    ld_s    r0,[r0,0]
> >
> > gcc/ChangeLog:
> >
> >       * config/arc/arc.h (arc_cd_to_as): Declare.
> >       (EXTRA_SPEC_FUNCTIONS): Register cd_to_as.
> >       (ASM_SPEC): Call cd_to_as with the CPU name and code-density
> >       markers from -mcode-density/-mno-code-density.
> >       * config/arc/driver-arc.cc (arc_lookup_cpu): New helper.
> >       (arc_cpu_to_as): Drop code-density handling.
> >       (arc_cd_to_as): New spec function; add -mcode-density only when
> >       appropriate, and omit it for -mno-code-density.
> >
> > Signed-off-by: Luis Silva <[email protected]>
> > ---
> >  gcc/config/arc/arc.h         |  9 +++--
> >  gcc/config/arc/driver-arc.cc | 66 +++++++++++++++++++++++++-----------
> >  2 files changed, 53 insertions(+), 22 deletions(-)
> >
> > diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
> > index f2a4f0de701..934ac6f89f4 100644
> > --- a/gcc/config/arc/arc.h
> > +++ b/gcc/config/arc/arc.h
> > @@ -70,9 +70,11 @@ along with GCC; see the file COPYING3.  If not see
> >  %{G*}                                                                \
> >  "
> >  extern const char *arc_cpu_to_as (int argc, const char **argv);
> > +extern const char *arc_cd_to_as (int argc, const char **argv);
> >
> >  #define EXTRA_SPEC_FUNCTIONS                 \
> > -  { "cpu_to_as", arc_cpu_to_as },
> > +  { "cpu_to_as", arc_cpu_to_as },            \
> > +  { "cd_to_as", arc_cd_to_as },
> >
> >  /* This macro defines names of additional specifications to put in the 
> > specs
> >     that can be used in various specifications like CC1_SPEC.  Its 
> > definition
> > @@ -97,8 +99,9 @@ extern const char *arc_cpu_to_as (int argc, const char 
> > **argv);
> >
> >  #undef ASM_SPEC
> >  #define ASM_SPEC  "%{mbig-endian|EB:-EB} %{EL} "                     \
> > -  "%:cpu_to_as(%{mcpu=*:%*}) %{mspfp*} %{mdpfp*} "                      \
> > -  "%{mfpu=fpuda*:-mfpuda} %{mcode-density}"
> > +  "%:cpu_to_as(%{mcpu=*:%*}) "                                             
> >   \
> > +  "%:cd_to_as(%{mcpu=*:%*} %{mno-code-density:no-cd;mcode-density:cd}) " \
> > +  "%{mspfp*} %{mdpfp*} %{mfpu=fpuda*:-mfpuda}"
> >
> >  /* Support for a compile-time default CPU and FPU.  The rules are:
> >     --with-cpu is ignored if -mcpu, mARC*, marc*, mA7, mA6 are specified.
> > diff --git a/gcc/config/arc/driver-arc.cc b/gcc/config/arc/driver-arc.cc
> > index b70b21cf231..b3efe87c67e 100644
> > --- a/gcc/config/arc/driver-arc.cc
> > +++ b/gcc/config/arc/driver-arc.cc
> > @@ -25,6 +25,25 @@
> >  #include "coretypes.h"
> >  #include "tm.h"
> >
> > +/* Look up the CPU given by NAME, or the default CPU if NAME is NULL.  */
> > +
> > +static const arc_cpu_t *
> > +arc_lookup_cpu (const char *name)
> > +{
> > +  if (name == NULL)
> > +    return &arc_cpu_types[(int) TARGET_CPU_DEFAULT];
> > +
> > +  for (const arc_cpu_t *arc_selected_cpu = arc_cpu_types;
> > +       arc_selected_cpu->name;
> > +       arc_selected_cpu++)
> > +    {
> > +      if (strcmp (arc_selected_cpu->name, name) == 0)
> > +     return arc_selected_cpu;
> > +    }
> > +
> > +  gcc_unreachable ();
> > +}
> > +
> >  /* Returns command line parameters to pass to as.  */
> >
> >  const char*
> > @@ -33,29 +52,12 @@ arc_cpu_to_as (int argc, const char **argv)
> >    const char *name = NULL;
> >    const arc_cpu_t *arc_selected_cpu;
> >
> > -  /* No argument, check what is the default cpu.  */
> > -  if (argc == 0)
> > -    {
> > -      arc_selected_cpu = &arc_cpu_types[(int) TARGET_CPU_DEFAULT];
> > -    }
> > -  else
> > -    {
> > -      name = argv[0];
> > -      for (arc_selected_cpu = arc_cpu_types; arc_selected_cpu->name;
> > -        arc_selected_cpu++)
> > -     {
> > -       if (strcmp (arc_selected_cpu->name, name) == 0)
> > -         break;
> > -     }
> > -    }
> > +  arc_selected_cpu = arc_lookup_cpu (argc == 0 ? NULL : argv[0]);
> >
> >    switch (arc_selected_cpu->arch_info->arch_id)
> >      {
> >      case BASE_ARCH_em:
> > -      if (arc_selected_cpu->flags & FL_CD)
> > -     name = "-mcode-density";
> > -      else
> > -     name = "";
> > +      name = "";
> >        if (arc_selected_cpu->flags & FL_FPUDA)
> >       name = concat ("-mfpuda ", name, NULL);
> >        if (arc_selected_cpu->flags & FL_SPFP)
> > @@ -81,3 +83,29 @@ arc_cpu_to_as (int argc, const char **argv)
> >      }
> >    return NULL;
> >  }
> > +
> > +/* Returns code density parameters to pass to as.  */
> > +
> > +const char *
> > +arc_cd_to_as (int argc, const char **argv)
> > +{
> > +  const char *name = NULL;
> > +  const arc_cpu_t *arc_selected_cpu;
> > +
> > +  for (int i = 0; i < argc; i++)
> > +    {
> > +      if (strcmp (argv[i], "no-cd") == 0)
> > +     return "";
> > +      else if (strcmp (argv[i], "cd") == 0)
> > +     return "-mcode-density";
> > +      else
> > +     name = argv[i];
> > +    }
> > +
> > +  arc_selected_cpu = arc_lookup_cpu (name);
> > +  if (arc_selected_cpu->arch_info->arch_id == BASE_ARCH_em
> > +      && (arc_selected_cpu->flags & FL_CD))
> > +    return "-mcode-density";
> > +
> > +  return "";
> > +}
> > --
> > 2.47.3

Reply via email to