minor optimization missed on SH
Schirmer, Hartmut
SchirmerH@Innovative-Systems.de
Wed Aug 15 01:24:00 GMT 2001
Hi,
the following code
-------------------
struct
{
long x;
short y;
struct
{
unsigned a : 12;
unsigned b : 4;
} s;
} u;
unsigned test(void)
{
return u.s.a;
}
-------------------
compiles to
-------------------
.file "bitf.i"
.data
! GNU C version 3.0 20010611 (prerelease) (sh-hitachi-coff)
! compiled by GNU C version 2.95.3-4 (cygwin special).
! options passed: -fpreprocessed -mrelax -m1 -ansi -O -Wall
! -Wwrite-strings -Wno-trigraphs -Wunused -Wno-main -Wundef
! -Wmissing-declarations -Wpointer-arith -ansi -fverbose-asm
! -fno-keep-static-consts -fno-strict-aliasing -fomit-frame-pointer
! options enabled: -fdefer-pop -fomit-frame-pointer -fthread-jumps
! -fpeephole -ffunction-cse -finline -freg-struct-return -fdelayed-branch
! -fsched-interblock -fsched-spec -fbranch-count-reg -fcommon -fverbose-asm
! -fgnu-linker -fargument-alias -fident -fguess-branch-probability
! -fmath-errno -m1 -mrelax
.text
.align 2
.global _test
_test:
mov.l L2,r1
mov.l @(4,r1),r0
shll16 r0
shlr16 r0
shlr2 r0
rts
shlr2 r0
L3:
.align 2
L2:
.long _u
.comm _u,8
.ident "GCC: (GNU) 3.0 20010611 (prerelease)"
-------------------
the sequence
shll16 r0
shlr16 r0
clears the upper 16bit of r0. Using
extu.w r0
would be faster and shorter.
GCC 2.95.2 produces the same code. Code is identical on
ever optimisation level > 0
Hartmut
More information about the Gcc
mailing list