GCC-SH: regmove fails to optimize SImode access
Toshi Morita
tm2@best.com
Fri Oct 13 14:43:00 GMT 2000
host: i386-linux
target: sh-elf
version: CVS 10/13/2000
options: -O2 -m4-single-only -ml
In jidctflt.i in stress-1.16, I am noticing gcc generate fairly weak code.
It appears regmove is not optimizing related addresses properly in this sample.
The compiler output is on the left; what it should generate is on the right.
_jpeg_idct_float:
mov.l r8,@-r15
add #64,r5
mov.l r9,@-r15
mov r6,r8
mov.l r10,@-r15
mov.l r11,@-r15
mov.l r12,@-r15
mov.l r13,@-r15
mov.w .L38,r3
mov.l r14,@-r15
fmov.s fr12,@-r15
mov.w .L39,r0
fmov.s fr13,@-r15
sub r3,r15
mov.w .L39,r1
mov r15,r14
mov.l @(12,r5),r6
add r14,r0
mov r14,r13
mov.l r7,@(4,r0)
add r14,r1
mov.w .L40,r0
mov #8,r5
mov r6,r11
mov.l r5,@(12,r1)
mov.l @(r0,r4),r4
mov.w .L41,r0
mov r4,r2
mov r14,r4
add r0,r2
mova .L42,r0
fmov.s @r0,fr12
mov.l r2,@(8,r1)
mov r8,r12
.L59:
mov r8,r7 add #16,r8
add #16,r12
mov r8,r10
add #32,r7
mov.w @r12,r2 mov.w @r8,r2 ; r8 + 16
add #48,r10 add #16,r8
mov.w @r7,r1 mov.w @r8,r1 ; r8 + 32
mov r8,r5
mov r8,r9
add #64,r5
mov r8,r3
or r1,r2 or r1,r2
mov r8,r0 add #16,r8
mov.w @r10,r1 mov.w @r8,r1 ; r8 + 48
add #80,r9
add #96,r3
or r1,r2 or r1,r2
add #16,r8
mov.w @r5,r1 mov.w @r8,r1 ; r8 + 64
add #112,r0
or r1,r2 or r1,r2
add #16,r8
mov.w @r9,r1 mov.w @r8,r1 ; r8 + 80
or r1,r2 or r1,r2
add #16,r8
mov.w @r3,r1 mov.w @r8,r1 ; r8 + 96
or r1,r2 or r1,r2
mov.w .L39,r1 mov.w .L39,r1
add r14,r1 add r14,r1
add #16,r8
mov.l r0,@(16,r1) mov r8,@(16,r1)
mov.w @r0,r1 mov.w @r8,r1 ; r8 + 112
or r1,r2 or r1,r2
tst r2,r2 tst r2,r2
bf.s .L58 bf.s .L58
add #-112,r8
mov.w @r8+,r1 mov.w @r8+,r1
bra .L36 bra .L36
add #32,r4 add #32,r4
insns: 34 29
regs: 11 4
It would be nice if the register allocator could use r0 to load the HImode values,
which would enable the mov.w @(offset, rm),rn addressing mode could be used.
This may be asking too much from a compiler, though.
.L59:
mov r8,r7 mov r8,r0
add #16,r12
mov r8,r10
add #32,r7
mov.w @r12,r2 mov @(16,r8),r0
add #48,r10
mov.w @r7,r1 mov @r8,r1
mov r8,r5
mov r8,r9
add #64,r5 add #32,r8
mov r8,r3
or r1,r2 or r0,r1
mov r8,r0
mov.w @r10,r1 mov @r8,r0
add #80,r9
add #96,r3
or r1,r2 or r0,r1
mov.w @r5,r1 mov.w @(16,r8),r0
add #112,r0 add #32,r8
or r1,r2 or r0,r1
mov.w @r9,r1 mov.w @r8,r0
or r1,r2 or r0,r1
mov.w @r3,r1 mov.w @(16,r8),r0
or r1,r2 or r0,r1
mov.w .L39,r1 mov.w .L39,r2
add r14,r1 add r14,r2
mov.l r0,@(16,r1) mov.l r0,@(16,r2)
add #32,r8
mov.w @r0,r1 mov.w @r8,r0
or r1,r2 or r0,r1
tst r2,r2 tst r2,r2
bf.s .L58 bf.s .L58
add #-112,r8
mov.w @r8+,r1 mov.w @r8+,r2
bra .L36 bra .L36
add #32,r4 add #32.r4
insns: 34 26
Toshi
More information about the Gcc-bugs
mailing list