Kazu Hirata
kazu****@cs*****
2004年 2月 3日 (火) 07:34:13 JST
佐藤様、 bitops.h の最適化です。 1. "& 7" は bit 操作命令が相手である限り省略できるのでそのようにしまし た。 2. ccrsave ですが、asm の中でしか使われないので、"=&r" を使い asm の出 力としてみなすことで、ccrsave = 0 の初期化を省きました。 3. 構築中、ccrsave の形が promote されて 16-bit になることがあったので、 %w1 とすることで、asm が正確に出力されるようにしました。 以上の変更で実行 file が多少、小くなります。よろしくご検討ください。 Kazu Hirata Index: bitops.h =================================================================== RCS file: /cvsroot/uclinux-h8/uClinux-2.4.x/include/asm-h8300/bitops.h,v retrieving revision 1.22 diff -u -r1.22 bitops.h --- bitops.h 2 Feb 2004 16:19:53 -0000 1.22 +++ bitops.h 2 Feb 2004 22:26:35 -0000 @@ -38,10 +38,9 @@ { \ volatile unsigned char *b_addr; \ b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3); \ - nr &= 7; \ - if (__builtin_constant_p (nr)) \ + if (__builtin_constant_p (nr & 7)) \ { \ - switch(nr) \ + switch(nr & 7) \ { \ case 0: \ __asm__(OP " #0,@%0" : :"r"(b_addr) : "memory"); \ @@ -118,13 +117,13 @@ #define __test_bit(nr, addr) test_bit((nr), (addr)) #define H8300_GEN_TEST_BITOP_IMM_INT(OP,BIT) \ - __asm__("stc ccr,%1\n\t" \ + __asm__("stc ccr,%w1\n\t" \ "orc #0x80,ccr\n\t" \ "bld #" BIT ",@%3\n\t" \ OP " #" BIT ",@%3\n\t" \ "rotxl.l %0\n\t" \ - "ldc %1,ccr" \ - : "=r"(retval),"+r"(ccrsave) \ + "ldc %w1,ccr" \ + : "=r"(retval),"=&r"(ccrsave) \ : "0" (retval),"r" (a) \ : "memory"); @@ -140,7 +139,7 @@ static __inline__ int FNNAME(int nr, volatile void * addr) \ { \ int retval = 0; \ - char ccrsave = 0; \ + char ccrsave; \ volatile unsigned char *a; \ \ a = (volatile unsigned char *)addr + ((nr >> 3) ^ 3); \ @@ -153,8 +152,8 @@ "inc.l #1,%0\n" \ "1:\n\t" \ "ldc %w1,ccr" \ - : "=r"(retval),"+r"(ccrsave) \ - : "0" (retval),"r" (a),"r"(nr & 7) \ + : "=r"(retval),"=&r"(ccrsave) \ + : "0" (retval),"r" (a),"r"(nr) \ : "memory"); \ return retval; \ } else { \ @@ -202,7 +201,7 @@ "inc.l #1,%0\n" \ "1:\n\t" \ : "=r"(retval) \ - : "0" (retval),"r" (a),"r"(nr & 7) \ + : "0" (retval),"r" (a),"r"(nr) \ : "memory"); \ return retval; \ } else { \