changeset 220:54e6bc7e760c

[project @ 2003-01-06 20:23:56 by bellard] update
author bellard
date Mon, 06 Jan 2003 20:23:56 +0000
parents 2c51bf34c5cf
children 6e624a2dd7a0
files tcctest.c
diffstat 1 files changed, 180 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/tcctest.c	Mon Jan 06 20:23:26 2003 +0000
+++ b/tcctest.c	Mon Jan 06 20:23:56 2003 +0000
@@ -67,6 +67,9 @@
 void old_style_function(void);
 void sizeof_test(void);
 void typeof_test(void);
+void local_label_test(void);
+void statement_expr_test(void);
+void asm_test(void);
 
 int fib(int n);
 void num(int n);
@@ -200,7 +203,7 @@
 #line 203 "test" 
     printf("__LINE__=%d __FILE__=%s\n",
            __LINE__, __FILE__);
-#line 200 "tcctest.c"
+#line 206 "tcctest.c"
 
     /* not strictly preprocessor, but we test it there */
 #ifdef C99_MACROS
@@ -467,6 +470,9 @@
     old_style_function();
     sizeof_test();
     typeof_test();
+    statement_expr_test();
+    local_label_test();
+    asm_test();
     return 0; 
 }
 
@@ -839,6 +845,16 @@
         }
     }
 
+    /* test ? : GCC extension */
+    {
+        static int v1 = 34 ? : -1; /* constant case */
+        static int v2 = 0 ? : -1; /* constant case */
+        int a = 30;
+        
+        printf("%d %d\n", v1, v2);
+        printf("%d %d\n", a - 30 ? : a * 2, a + 1 ? : a * 2);
+    }
+
     /* again complex expression */
     for(i=0;i<256;i++) {
         if (toupper1 (i) != TOUPPER (i))
@@ -846,7 +862,13 @@
     }
 }
 
+/* GCC accepts that */
+static int tab_reinit[];
+static int tab_reinit[10];
 
+//int cinit1; /* a global variable can be defined several times without error ! */
+int cinit1; 
+int cinit1; 
 int cinit1 = 0;
 int *cinit2 = (int []){3, 2, 1};
 
@@ -1072,6 +1094,12 @@
         "a2", 1
 };
 
+int sinit18[10] = {
+    [2 ... 5] = 20,
+    2,
+    [8] = 10,
+};
+
 void init_test(void)
 {
     int linit1 = 2;
@@ -1161,8 +1189,12 @@
     printf("sinit17=%s %d %s %d\n",
            sinit17[0].s, sinit17[0].len,
            sinit17[1].s, sinit17[1].len);
+    for(i=0;i<10;i++)
+        printf("%x ", sinit18[i]);
+    printf("\n");
 }
 
+
 void switch_test()
 {
     int i;
@@ -1659,3 +1691,150 @@
     c = 3.5;
     printf("a=%f b=%f c=%f\n", a, b, c);
 }
+
+void statement_expr_test(void)
+{
+    int a, i;
+
+    a = 0;
+    for(i=0;i<10;i++) {
+        a += 1 + 
+            ( { int b, j; 
+                b = 0; 
+                for(j=0;j<5;j++) 
+                    b += j; b; 
+            } );
+    }
+    printf("a=%d\n", a);
+    
+}
+
+void local_label_test(void)
+{
+    int a;
+    goto l1;
+ l2:
+    a = 1 + ({
+        __label__ l1, l2, l3;
+        goto l4;
+    l5:
+        printf("aa1\n");
+        goto l1;
+    l2:
+        printf("aa3\n");
+        goto l3;
+    l1:
+        printf("aa2\n");
+        goto l2;
+    l3:;
+        1;
+    });
+    printf("a=%d\n", a);
+    return;
+ l1:
+    printf("bb1\n");
+    goto l2;
+ l4:
+    printf("bb2\n");
+    goto l5;
+}
+
+/* inline assembler test */
+#ifdef __i386__
+
+/* from linux kernel */
+static char * strncat1(char * dest,const char * src,size_t count)
+{
+int d0, d1, d2, d3;
+__asm__ __volatile__(
+	"repne\n\t"
+	"scasb\n\t"
+	"decl %1\n\t"
+	"movl %8,%3\n"
+	"1:\tdecl %3\n\t"
+	"js 2f\n\t"
+	"lodsb\n\t"
+	"stosb\n\t"
+	"testb %%al,%%al\n\t"
+	"jne 1b\n"
+	"2:\txorl %2,%2\n\t"
+	"stosb"
+	: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+	: "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
+	: "memory");
+return dest;
+}
+
+static inline void * memcpy1(void * to, const void * from, size_t n)
+{
+int d0, d1, d2;
+__asm__ __volatile__(
+	"rep ; movsl\n\t"
+	"testb $2,%b4\n\t"
+	"je 1f\n\t"
+	"movsw\n"
+	"1:\ttestb $1,%b4\n\t"
+	"je 2f\n\t"
+	"movsb\n"
+	"2:"
+	: "=&c" (d0), "=&D" (d1), "=&S" (d2)
+	:"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
+	: "memory");
+return (to);
+}
+
+static __inline__ void sigaddset1(unsigned int *set, int _sig)
+{
+	__asm__("btsl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
+}
+
+static __inline__ void sigdelset1(unsigned int *set, int _sig)
+{
+	asm("btrl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
+}
+
+static __inline__ __const__ unsigned int swab32(unsigned int x)
+{
+	__asm__("xchgb %b0,%h0\n\t"	/* swap lower bytes	*/
+		"rorl $16,%0\n\t"	/* swap words		*/
+		"xchgb %b0,%h0"		/* swap higher bytes	*/
+		:"=q" (x)
+		: "0" (x));
+	return x;
+}
+
+unsigned int set;
+
+void asm_test(void)
+{
+    char buf[128];
+    unsigned int val;
+
+    printf("inline asm:\n");
+    memcpy1(buf, "hello", 6);
+    strncat1(buf, " worldXXXXX", 3);
+    printf("%s\n", buf);
+
+    set = 0xff;
+    sigdelset1(&set, 2);
+    sigaddset1(&set, 16);
+    /* NOTE: we test here if C labels are correctly restored after the
+       asm statement */
+    goto label1;
+ label2:
+    __asm__("btsl %1,%0" : "=m"(set) : "Ir"(20) : "cc");
+    printf("set=0x%x\n", set);
+    val = 0x01020304;
+    printf("swab32(0x%08x) = 0x%0x\n", val, swab32(val));
+    return;
+ label1:
+    goto label2;
+}
+
+#else
+
+void asm_test(void)
+{
+}
+
+#endif