On 2/16/19, H.J. Lu <hjl.to...@gmail.com> wrote:
> 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

You have to wrap the pattern in a parallel in the expander.

Uros.

>
> [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