This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, ARM] Improve code-gen for multiple shifted accumulations in array indexing


Hi,

This patch improves the code-gen of -marm in the case of two-dimensional array access.

Given the following code:

typedef struct { int x,y,a,b; } X;

int
f7a(X p[][4], int x, int y)
{
  return p[x][y].a;
}

The code-gen on -O2 -marm -mcpu=cortex-a15 is currently

        mov     r2, r2, asl #4
        add     r1, r2, r1, asl #6
        add     r0, r0, r1
        ldr     r0, [r0, #8]
        bx      lr

With the patch, we'll get:

        add     r1, r0, r1, lsl #6
        add     r2, r1, r2, lsl #4
        ldr     r0, [r2, #8]
        bx      lr

The -mthumb code-gen had been OK.

The patch has passed the bootstrapping on cortex-a15 and the arm-none-eabi regtest, with no code-gen difference in spec2k (unfortunately).

OK for the trunk?

Thanks,
Yufeng

gcc/

	* config/arm/arm.c (arm_reassoc_shifts_in_address): New declaration
	and new function.
	(arm_legitimize_address): Call the new functions.
	(thumb_legitimize_address): Prefix the declaration with static.

gcc/testsuite/

	* gcc.target/arm/shifted-add-1.c: New test.
	* gcc.target/arm/shifted-add-2.c: Ditto.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]