[Uclinux-h8-devel] Improve bitops.h

Zurück zum Archiv-Index

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 {                                                           \



Uclinux-h8-devel メーリングリストの案内
Zurück zum Archiv-Index