On Sat, Feb 16, 2019 at 12:58 AM Uros Bizjak <ubiz...@gmail.com> wrote:
>
> On 2/16/19, H.J. Lu <hjl.to...@gmail.com> wrote:
> > With SSE emulation of MMX intrinsics, we should make _mm_empty () as NOP
> > when MMX is disabled.
> >
> >       PR target/89021
> >       * config/i386/mmx.md (mmx_<emms>): Renamed to ...
> >       (mmx_<emms>_1): This.
> >       (mmx_<emms>): New expander.
> > ---
> >  gcc/config/i386/mmx.md | 29 ++++++++++++++++++++++++++++-
> >  1 file changed, 28 insertions(+), 1 deletion(-)
> >
> > diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md
> > index 9cf0251293a..0f925c0b1ea 100644
> > --- a/gcc/config/i386/mmx.md
> > +++ b/gcc/config/i386/mmx.md
> > @@ -1848,7 +1848,34 @@
> >    [(UNSPECV_EMMS "emms")
> >     (UNSPECV_FEMMS "femms")])
> >
> > -(define_insn "mmx_<emms>"
> > +(define_expand "mmx_<emms>"
> > +  [(unspec_volatile [(const_int 0)] EMMS)
> > +   (clobber (reg:XF ST0_REG))
> > +   (clobber (reg:XF ST1_REG))
> > +   (clobber (reg:XF ST2_REG))
> > +   (clobber (reg:XF ST3_REG))
> > +   (clobber (reg:XF ST4_REG))
> > +   (clobber (reg:XF ST5_REG))
> > +   (clobber (reg:XF ST6_REG))
> > +   (clobber (reg:XF ST7_REG))
> > +   (clobber (reg:DI MM0_REG))
> > +   (clobber (reg:DI MM1_REG))
> > +   (clobber (reg:DI MM2_REG))
> > +   (clobber (reg:DI MM3_REG))
> > +   (clobber (reg:DI MM4_REG))
> > +   (clobber (reg:DI MM5_REG))
> > +   (clobber (reg:DI MM6_REG))
> > +   (clobber (reg:DI MM7_REG))]
> > +  "TARGET_MMX || TARGET_MMX_WITH_SSE"
> > +{
> > +   if (TARGET_MMX)
> > +     emit_insn (gen_mmx_<emms>_1 ());
> > +   else
> > +     emit_insn (gen_nop ());
> > +   DONE;
>
> The above should be written as:
>
> if (!TARGET_MMX)
>   {
>     emit_insn (gen_nop ()));
>     DONE;
>   }
>
> > +})
> > +
> > +(define_insn "mmx_<emms>_1"
>
> The old insn should be renamed to "*mmx_<emms>".
>
> Uros.

Tried and got

[hjl@gnu-cfl-2 gcc]$ cat x.c
#include <mmintrin.h>

void
foo (void)
{
  _mm_empty ();
}
[hjl@gnu-cfl-2 gcc]$ ./xgcc -B./ -S x.c -da
x.c: In function ‘foo’:
x.c:7:1: error: unrecognizable insn:
    7 | }
      | ^
(insn 5 2 6 2 (unspec_volatile [
            (const_int 0 [0])
        ] UNSPECV_EMMS) "./include/mmintrin.h":60:3 -1
     (nil))
during RTL pass: vregs
dump file: x.c.234r.vregs
x.c:7:1: internal compiler error: in extract_insn, at recog.c:2310
0x10ad84d _fatal_insn(char const*, rtx_def const*, char const*, int,
char const*)
/export/gnu/import/git/gitlab/x86-gcc/gcc/rtl-error.c:108
0x10ad88e _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
/export/gnu/import/git/gitlab/x86-gcc/gcc/rtl-error.c:116
0x1042abb extract_insn(rtx_insn*)
/export/gnu/import/git/gitlab/x86-gcc/gcc/recog.c:2310
0xc95912 instantiate_virtual_regs_in_insn
/export/gnu/import/git/gitlab/x86-gcc/gcc/function.c:1654
0xc96d44 instantiate_virtual_regs
/export/gnu/import/git/gitlab/x86-gcc/gcc/function.c:1975
0xc96e0e execute
/export/gnu/import/git/gitlab/x86-gcc/gcc/function.c:2024
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
[hjl@gnu-cfl-2 gcc]$

;;
;; Full RTL generated for this function:
;;
(note 1 0 3 NOTE_INSN_DELETED)
;; basic block 2, loop depth 0, maybe hot
;;  prev block 0, next block 1, flags: (NEW, REACHABLE, RTL)
;;  pred:       ENTRY (FALLTHRU)
(note 3 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
(note 2 3 5 2 NOTE_INSN_FUNCTION_BEG)
(insn 5 2 6 2 (unspec_volatile [
            (const_int 0 [0])
        ] UNSPECV_EMMS) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 6 5 7 2 (clobber (reg:XF 8 st)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 7 6 8 2 (clobber (reg:XF 9 st(1))) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 8 7 9 2 (clobber (reg:XF 10 st(2))) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 9 8 10 2 (clobber (reg:XF 11 st(3))) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 10 9 11 2 (clobber (reg:XF 12 st(4))) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 11 10 12 2 (clobber (reg:XF 13 st(5))) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 12 11 13 2 (clobber (reg:XF 14 st(6))) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 13 12 14 2 (clobber (reg:XF 15 st(7))) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 14 13 15 2 (clobber (reg:DI 28 mm0)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 15 14 16 2 (clobber (reg:DI 29 mm1)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 16 15 17 2 (clobber (reg:DI 30 mm2)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 17 16 18 2 (clobber (reg:DI 31 mm3)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 18 17 19 2 (clobber (reg:DI 32 mm4)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 19 18 20 2 (clobber (reg:DI 33 mm5)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 20 19 21 2 (clobber (reg:DI 34 mm6)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 21 20 25 2 (clobber (reg:DI 35 mm7)) "./include/mmintrin.h":60:3 -1
     (nil))
(insn 25 21 0 2 (const_int 0 [0]) "./include/mmintrin.h":61:1 -1
     (nil))
;;  succ:       EXIT [always]  (FALLTHRU)



-- 
H.J.

Reply via email to