On Fri, Jul 30, 2021 at 4:58 AM Joseph Myers <jos...@codesourcery.com> wrote:
>
> On Tue, 27 Jul 2021, Hongtao Liu via Gcc-patches wrote:
>
> > modified   gcc/emit-rtl.c
> > @@ -928,6 +928,10 @@ validate_subreg (machine_mode omode, machine_mode 
> > imode,
> >       fix them all.  */
> >    if (omode == word_mode)
> >      ;
> > +  /* ???Similarly like (subreg:DI (reg:SF), also allow (subreg:SI (reg:HF))
> > +     here. Though extract_bit_field is the culprit here, not the backends. 
> >  */
> > +  else if (imode == HFmode && omode == SImode)
> > +    ;
>
> You can't reference HFmode by name at all in any target-independent file,
> outside of a #ifdef HAVE_HFmode conditional.  It's only defined in
> architecture-specific <arch>-modes.def for those architectures supporting
> that mode, so you'll have an undefined identifier building for other
> targets if you reference it in a generic source file.  You have to
> condition things on the logical properties of the mode that are relevant,
> not on the target-specific name (or use a HAVE_HFmode conditional, but
> basing things on logical properties is clearly better where possible).
>
Yes, I didn't notice that, thanks for the explanation.
And I guess the same logic is also applies to BFmode(or other 16bit
float mode) if it existed, so add something like

modified   gcc/emit-rtl.c
@@ -928,6 +928,11 @@ validate_subreg (machine_mode omode, machine_mode imode,
      fix them all.  */
   if (omode == word_mode)
     ;
+  /* ???Similarly like (subreg:DI (reg:SF), also allow (subreg:SI (reg:HF))
+     here. Though extract_bit_field is the culprit here, not the backends.  */
+  else if (known_gt (regsize, osize) && known_gt (osize, isize)
+    && FLOAT_MODE_P (imode) && INTEGRAL_MODE_P (omode))
+    ;
> --
> Joseph S. Myers
> jos...@codesourcery.com



-- 
BR,
Hongtao

Reply via email to