changeset 710:4348f61a5e54

*** empty log message ***
author kono
date Thu, 25 Oct 2007 13:58:42 +0900
parents 8b54c40081de
children 35e6841ba01a
files Changes test/code-gen-all.c test/code-gen.c
diffstat 3 files changed, 78 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Wed Oct 24 21:54:26 2007 +0900
+++ b/Changes	Thu Oct 25 13:58:42 2007 +0900
@@ -9611,4 +9611,32 @@
 adhoc に code_save_register_stack  とか使ったけど、本当は、
 削除出来るんだろ。
 
-
+Thu Oct 25 08:19:20 JST 2007
+
+Mac OS X も、LP64 なので、
+
+http://www.unix.org/version2/whatsnew/lp64_wp.html
+
+このcompilerも、int->long に書き換える必要がある。
+ということは...
+  #define int long
+でも、いいんだけど...
+  int i;
+  printf("%d\n",i);
+で、こける。
+  int i;
+  printf("%ld\n",i);
+でないとだめ。
+
+やっぱり、pointer が入る部分だけ、long に書き直すのが良いのかな。
+
+ふーん.... PPCの書き換えは、それほど大変ではなさそうだが...
+
+むしろ、long double の実装の方がなぁ...
+
+switch で、long long ってのもありみたいだね。まぁ、64bit のみで
+実装と言うのが良いんでしょうけど。
+
+long を64にするのは、難しくないが、int がshort と同じ扱いになるの?
+extend するのもあれだが...
+
--- a/test/code-gen-all.c	Wed Oct 24 21:54:26 2007 +0900
+++ b/test/code-gen-all.c	Thu Oct 25 13:58:42 2007 +0900
@@ -2,11 +2,15 @@
 int main() {
 #define FLOAT_CODE 1
 #define LONGLONG_CODE 1
+#define LONG_DOUBLE_CODE 0
 #ifdef INLINE
 #else
 #define INLINE
 #endif
 	code_endian();
+#if 1
+#else
+#endif
 	code_lvar();
 	code_lvar_address();
 	code_label();
@@ -32,7 +36,11 @@
 	code_return_int();
 #if FLOAT_CODE
 	code_return_float();
+#if LONG_DOUBLE_CODE 
+#endif
 	code_return_double();
+#if LONG_DOUBLE_CODE 
+#endif
 #endif
 #if LONGLONG_CODE
 	code_return_longlong();
@@ -56,6 +64,10 @@
 	code_srindirect();
 #if FLOAT_CODE
 	code_drindirect();
+#if LONG_DOUBLE_CODE 
+#endif
+#if LONG_DOUBLE_CODE 
+#endif
 #endif
 #if LONGLONG_CODE
 	code_lrindirect();
--- a/test/code-gen.c	Wed Oct 24 21:54:26 2007 +0900
+++ b/test/code-gen.c	Thu Oct 25 13:58:42 2007 +0900
@@ -2,12 +2,14 @@
 
 #define FLOAT_CODE 1
 #define LONGLONG_CODE 1
+#define LONG_DOUBLE_CODE 0
 
 #ifdef INLINE
 #else
 #define INLINE
 #endif
 
+
 // code_lvar(int e2,int creg) 
 
 extern int printf(const char *fmt,...);
@@ -19,11 +21,15 @@
 	unsigned char a[8];
 	unsigned short s;
 	unsigned int i;
-	unsigned long long l;
+	unsigned long l;
+	unsigned long long ll;
     } u;
-    printf("sizeof(int)=%d\n",sizeof(char));
+    u.ll = 0;
+    printf("sizeof(char)=%d\n",sizeof(char));
     printf("sizeof(short)=%d\n",sizeof(short));
     printf("sizeof(int)=%d\n",sizeof(int));
+    printf("sizeof(long)=%d\n",sizeof(long));
+    printf("sizeof(int*)=%d\n",sizeof(int*));
     printf("sizeof(long long)=%d\n",sizeof(long long));
     printf("sizeof(float)=%d\n",sizeof(float));
     printf("sizeof(double)=%d\n",sizeof(double));
@@ -32,9 +38,17 @@
     printf("#0025:endian s : %02x %02x\n",u.a[0],u.a[1]);
     u.i = 0x01234567;
     printf("#0027:endian i : %02x %02x %02x %02x\n",u.a[0],u.a[1],u.a[2],u.a[3]);
+#if 1
+    u.l = 0x01234567L;
+    printf("#0027:endian l : %02x %02x %02x %02x\n",u.a[0],u.a[1],u.a[2],u.a[3]);
+#else
     u.l = 0x0123456789abcdefULL;
     printf("#0029:endian l : %02x %02x %02x %02x\n",u.a[0],u.a[1],u.a[2],u.a[3]);
     printf("#0030:endian l : %02x %02x %02x %02x\n",u.a[4],u.a[5],u.a[6],u.a[7]);
+#endif
+    u.ll = 0x0123456789abcdefULL;
+    printf("#0029:endian ll: %02x %02x %02x %02x\n",u.a[0],u.a[1],u.a[2],u.a[3]);
+    printf("#0030:endian ll: %02x %02x %02x %02x\n",u.a[4],u.a[5],u.a[6],u.a[7]);
 }
 
 INLINE void
@@ -310,12 +324,23 @@
 {
     return 1.0;
 }
+#if LONG_DOUBLE_CODE 
+INLINE long double
+ code_return_long_double0()
+{
+    return 1.0;
+}
+#endif
 INLINE void
 code_return_double()
 {
     printf("#0307:code_return_double %g\n",code_return_double0());
+#if LONG_DOUBLE_CODE 
+    printf("#0307:code_return_double %Lg\n",code_return_long_double0());
+#endif
 }
 
+
 #endif
 
 #if LONGLONG_CODE
@@ -853,16 +878,26 @@
 {
     float i1,i2; 
     double ui1,ui2; 
+    double di1,di2; 
     float *pi1,*pi2; 
     double *pui1,*pui2; 
+#if LONG_DOUBLE_CODE 
+    long double *pdi1,*pdi2; 
+#endif
 
     i1 = -55; i2= 55;
     ui1 = 200; ui2= 128;
+    di1 = 200; di2= 128;
     pi1 = &i1;
     pi2 = &i2;
     pui1 = &ui1;
     pui2 = &ui2;
     printf("#0856:code_dindirect %g %g %g %g\n",*pi1,*pi2,*pui1,*pui2);
+#if LONG_DOUBLE_CODE 
+    pdi1 = &di1;
+    pdi2 = &di2;
+    printf("#0856:code_dindirect %Lg %Lg\n",*pdi1,*pdi2);
+#endif
 }
 
 #endif