2013/5/24 Xinyu Qi <x...@marvell.com>:
> Hi,
>
>   For this simple case, compiled with option -march=iwmmxt -O,
> #define N 64
> signed int b[N];
> signed long long j[N], d[N];
> void foo (void)
> {
>   int i;
>   for (i = 0; i < N; i++)
>     j[i] = d[i] << b[i];
> }
> An internal compiler error occurs,
> error: insn does not satisfy its constraints:
> (insn 112 74 75 3 (set (reg:SI 96 wcgr0)
>         (mem/c:SI (plus:SI (reg:SI 3 r3 [orig:174 ivtmp.19 ] [174])
>                 (reg/f:SI 0 r0 [183])) [0 MEM[symbol: b, index: ivtmp.19_14, 
> offset: 0B]+0 S4 A32])) {*iwmmxt_movsi_insn}
>      (nil))
>
> The load address of wmmx wcgr register cannot accept the register offset mode 
> and the reload pass fails to fix it, so that such error happens.
> This issue could be solved by adding check code for IWMMXT_GR_REGS class in 
> the SECONDARY_RELOAD MACRO if TARGET_IWMMXT. Current code only check the 
> IWMMXT_REGS group.
> Patch attached with a new test.
> Pass full dejagnu test. No regression.
>
> Is this fix proper?
> OK for trunk?
>

I cannot approve it.  But here are some comments and hope it helps.


> ChangeLog
> gcc/
> 2013-05-24  Xinyu Qi  <x...@marvell.com>
>
>         * config/arm/arm.h (SECONDARY_OUTPUT_RELOAD_CLASS): Check 
> IWMMXT_GR_REGS.

This line just ends at 81 column.
How about this one?

2013-05-24  Xinyu Qi  <x...@marvell.com>

        * config/arm/arm.h (SECONDARY_OUTPUT_RELOAD_CLASS): Check
        IWMMXT_GR_REGS register class.
        (SECONDARY_INPUT_RELOAD_CLASS): Likewise.

>
> testsuite/
> 2013-05-24  Xinyu Qi  <x...@marvell.com>
>
>         * gcc.target/arm/mmx-3.c: New test.


> Index: gcc/config/arm/arm.h
> ===================================================================
> --- gcc/config/arm/arm.h    (revision 199090)
> +++ gcc/config/arm/arm.h    (working copy)
> @@ -1280,7 +1280,8 @@
>    ((TARGET_VFP && TARGET_HARD_FLOAT                \
>      && IS_VFP_CLASS (CLASS))                    \
>     ? coproc_secondary_reload_class (MODE, X, FALSE)        \
> -   : (TARGET_IWMMXT && (CLASS) == IWMMXT_REGS)            \
> +   : (TARGET_IWMMXT && ((CLASS) == IWMMXT_REGS)            \
> +                        || (CLASS) == IWMMXT_GR_REGS)        \

I think it should be

+   : (TARGET_IWMMXT && ((CLASS) == IWMMXT_REGS            \
+                        || (CLASS) == IWMMXT_GR_REGS))        \


>     ? coproc_secondary_reload_class (MODE, X, TRUE)        \
>     : TARGET_32BIT                        \
>     ? (((MODE) == HImode && ! arm_arch4 && true_regnum (X) == -1) \
> @@ -1293,7 +1294,8 @@
>    ((TARGET_VFP && TARGET_HARD_FLOAT                \
>      && IS_VFP_CLASS (CLASS))                    \
>      ? coproc_secondary_reload_class (MODE, X, FALSE) :        \
> -    (TARGET_IWMMXT && (CLASS) == IWMMXT_REGS) ?            \
> +    (TARGET_IWMMXT && ((CLASS) == IWMMXT_REGS            \
> +                       || (CLASS) == IWMMXT_GR_REGS)) ?        \
>      coproc_secondary_reload_class (MODE, X, TRUE) :        \
>     (TARGET_32BIT ?                        \
>      (((CLASS) == IWMMXT_REGS || (CLASS) == IWMMXT_GR_REGS)    \

It seems that you didn't CC arm maintainer.
Let me do this for you. :)


Best regards,
jasonwucj

Reply via email to