Native threads
authorstefan <none@none>
Sun, 14 Dec 2003 18:11:35 +0000 (18:11 +0000)
committerstefan <none@none>
Sun, 14 Dec 2003 18:11:35 +0000 (18:11 +0000)
asmpart.h
builtin.c
jit/i386/asmpart.S
src/vm/builtin.c
src/vm/jit/asmpart.h
src/vm/jit/i386/asmpart.S

index d0cd0f1d417241883fa59f95ed159b4ac9876cfa..cf8c569b7b3a4c52b1cd6f9674808a617eceeb7e 100644 (file)
--- a/asmpart.h
+++ b/asmpart.h
@@ -29,7 +29,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: asmpart.h 771 2003-12-13 23:11:08Z stefan $
+   $Id: asmpart.h 779 2003-12-14 18:11:35Z stefan $
 
 */
 
@@ -102,6 +102,8 @@ void *asm_switchstackandcall(void *stack, void *func, void **stacktopsave, void
 void asm_builtin_trace();
 void asm_builtin_exittrace();
 
+int asm_xadd(int *, int);
+
 #endif /* _ASMPART_H */
 
 
index 18f81b354075ac5dc2eaf327796aafc2ecca4523..eb35877842f71955764a07593bce3045ab7de893 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -34,7 +34,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 730 2003-12-11 21:23:31Z edwin $
+   $Id: builtin.c 779 2003-12-14 18:11:35Z stefan $
 
 */
 
@@ -174,7 +174,7 @@ builtin_descriptor builtin_desc[] = {
 
 s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
 { 
-       classinfo *tmp;
+       /*classinfo *tmp;*/
        if (super->flags & ACC_INTERFACE)
                return (sub->vftbl->interfacetablelength > super->index) &&
                        (sub->vftbl->interfacetable[-super->index] != NULL);
@@ -207,21 +207,43 @@ s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
                        sub->vftbl->baseval, super->vftbl->baseval, (unsigned)(sub->vftbl->baseval - super->vftbl->baseval),
                        super->vftbl->diffval); */
 
-       return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_lock();
+#endif
+
+       s4 res = (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
                (unsigned) (super->vftbl->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_unlock();
+#endif
+
+       return res;
 }
 
 /* XXX inline this? */
 s4 builtin_isanysubclass_vftbl(vftbl *sub,vftbl *super)
 {
        int base;
+       s4 res;
        
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_lock();
+#endif
+
        if ((base = super->baseval) <= 0)
                /* super is an interface */
-               return (sub->interfacetablelength > -base) &&
+               res = (sub->interfacetablelength > -base) &&
                        (sub->interfacetable[base] != NULL);
-       return (unsigned) (sub->baseval - base)
-               <= (unsigned) (super->diffval);
+       else
+           res = (unsigned) (sub->baseval - base)
+                       <= (unsigned) (super->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_unlock();
+#endif
+
+       return res;
 }
 
 
@@ -400,6 +422,8 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o)
        valuevftbl = o->vftbl;
 
     if ((dim_m1 = desc->dimension - 1) == 0) {
+               s4 res;
+
                /* {a is a one-dimensional array} */
                /* {a is an array of references} */
                
@@ -411,8 +435,18 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o)
                        return (valuevftbl->interfacetablelength > -base &&
                                        valuevftbl->interfacetable[base] != NULL);
                
-               return (unsigned)(valuevftbl->baseval - base)
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+               cast_lock();
+#endif
+
+               res = (unsigned)(valuevftbl->baseval - base)
                        <= (unsigned)(componentvftbl->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+               cast_unlock();
+#endif
+
+               return res;
     }
     /* {a has dimension > 1} */
        /* {componentvftbl->arraydesc != NULL} */
@@ -433,6 +467,7 @@ s4 builtin_canstore_onedim (java_objectarray *a, java_objectheader *o)
        vftbl *elementvftbl;
        vftbl *valuevftbl;
        int base;
+       s4 res;
        
        if (!o) return 1;
 
@@ -458,8 +493,18 @@ s4 builtin_canstore_onedim (java_objectarray *a, java_objectheader *o)
                return (valuevftbl->interfacetablelength > -base &&
                                valuevftbl->interfacetable[base] != NULL);
        
-       return (unsigned)(valuevftbl->baseval - base)
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_lock();
+#endif
+
+       res = (unsigned)(valuevftbl->baseval - base)
                <= (unsigned)(elementvftbl->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_unlock();
+#endif
+
+       return res;
 }
 
 
@@ -470,6 +515,7 @@ s4 builtin_canstore_onedim_class(java_objectarray *a, java_objectheader *o)
 {
        vftbl *elementvftbl;
        vftbl *valuevftbl;
+       s4 res;
        
        if (!o) return 1;
 
@@ -490,8 +536,18 @@ s4 builtin_canstore_onedim_class(java_objectarray *a, java_objectheader *o)
        if (valuevftbl == elementvftbl)
                return 1;
 
-       return (unsigned)(valuevftbl->baseval - elementvftbl->baseval)
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_lock();
+#endif
+
+       res = (unsigned)(valuevftbl->baseval - elementvftbl->baseval)
                <= (unsigned)(elementvftbl->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_unlock();
+#endif
+
+       return res;
 }
 
 
index 8c0cacd8872e3791f9a17ea12785ae2705176d33..3951e1a24651481c9a5ffa9f6bd32373f305e645 100644 (file)
@@ -29,7 +29,7 @@
             Reinhard Grafl
             Christian Thalinger
 
-   $Id: asmpart.S 771 2003-12-13 23:11:08Z stefan $
+   $Id: asmpart.S 779 2003-12-14 18:11:35Z stefan $
 
 */
 
@@ -1173,6 +1173,13 @@ asm_builtin_exittrace:
         popa
         ret
 
+asm_xadd:
+               mov 4(%esp),%ecx
+               mov 8(%esp),%eax
+               lock
+               xaddl %eax,0(%ecx)
+           incl %eax
+               ret
 
 /*
  * These are local overrides for various environment variables in Emacs.
index 18f81b354075ac5dc2eaf327796aafc2ecca4523..eb35877842f71955764a07593bce3045ab7de893 100644 (file)
@@ -34,7 +34,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 730 2003-12-11 21:23:31Z edwin $
+   $Id: builtin.c 779 2003-12-14 18:11:35Z stefan $
 
 */
 
@@ -174,7 +174,7 @@ builtin_descriptor builtin_desc[] = {
 
 s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
 { 
-       classinfo *tmp;
+       /*classinfo *tmp;*/
        if (super->flags & ACC_INTERFACE)
                return (sub->vftbl->interfacetablelength > super->index) &&
                        (sub->vftbl->interfacetable[-super->index] != NULL);
@@ -207,21 +207,43 @@ s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
                        sub->vftbl->baseval, super->vftbl->baseval, (unsigned)(sub->vftbl->baseval - super->vftbl->baseval),
                        super->vftbl->diffval); */
 
-       return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_lock();
+#endif
+
+       s4 res = (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
                (unsigned) (super->vftbl->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_unlock();
+#endif
+
+       return res;
 }
 
 /* XXX inline this? */
 s4 builtin_isanysubclass_vftbl(vftbl *sub,vftbl *super)
 {
        int base;
+       s4 res;
        
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_lock();
+#endif
+
        if ((base = super->baseval) <= 0)
                /* super is an interface */
-               return (sub->interfacetablelength > -base) &&
+               res = (sub->interfacetablelength > -base) &&
                        (sub->interfacetable[base] != NULL);
-       return (unsigned) (sub->baseval - base)
-               <= (unsigned) (super->diffval);
+       else
+           res = (unsigned) (sub->baseval - base)
+                       <= (unsigned) (super->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_unlock();
+#endif
+
+       return res;
 }
 
 
@@ -400,6 +422,8 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o)
        valuevftbl = o->vftbl;
 
     if ((dim_m1 = desc->dimension - 1) == 0) {
+               s4 res;
+
                /* {a is a one-dimensional array} */
                /* {a is an array of references} */
                
@@ -411,8 +435,18 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o)
                        return (valuevftbl->interfacetablelength > -base &&
                                        valuevftbl->interfacetable[base] != NULL);
                
-               return (unsigned)(valuevftbl->baseval - base)
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+               cast_lock();
+#endif
+
+               res = (unsigned)(valuevftbl->baseval - base)
                        <= (unsigned)(componentvftbl->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+               cast_unlock();
+#endif
+
+               return res;
     }
     /* {a has dimension > 1} */
        /* {componentvftbl->arraydesc != NULL} */
@@ -433,6 +467,7 @@ s4 builtin_canstore_onedim (java_objectarray *a, java_objectheader *o)
        vftbl *elementvftbl;
        vftbl *valuevftbl;
        int base;
+       s4 res;
        
        if (!o) return 1;
 
@@ -458,8 +493,18 @@ s4 builtin_canstore_onedim (java_objectarray *a, java_objectheader *o)
                return (valuevftbl->interfacetablelength > -base &&
                                valuevftbl->interfacetable[base] != NULL);
        
-       return (unsigned)(valuevftbl->baseval - base)
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_lock();
+#endif
+
+       res = (unsigned)(valuevftbl->baseval - base)
                <= (unsigned)(elementvftbl->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_unlock();
+#endif
+
+       return res;
 }
 
 
@@ -470,6 +515,7 @@ s4 builtin_canstore_onedim_class(java_objectarray *a, java_objectheader *o)
 {
        vftbl *elementvftbl;
        vftbl *valuevftbl;
+       s4 res;
        
        if (!o) return 1;
 
@@ -490,8 +536,18 @@ s4 builtin_canstore_onedim_class(java_objectarray *a, java_objectheader *o)
        if (valuevftbl == elementvftbl)
                return 1;
 
-       return (unsigned)(valuevftbl->baseval - elementvftbl->baseval)
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_lock();
+#endif
+
+       res = (unsigned)(valuevftbl->baseval - elementvftbl->baseval)
                <= (unsigned)(elementvftbl->diffval);
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       cast_unlock();
+#endif
+
+       return res;
 }
 
 
index d0cd0f1d417241883fa59f95ed159b4ac9876cfa..cf8c569b7b3a4c52b1cd6f9674808a617eceeb7e 100644 (file)
@@ -29,7 +29,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: asmpart.h 771 2003-12-13 23:11:08Z stefan $
+   $Id: asmpart.h 779 2003-12-14 18:11:35Z stefan $
 
 */
 
@@ -102,6 +102,8 @@ void *asm_switchstackandcall(void *stack, void *func, void **stacktopsave, void
 void asm_builtin_trace();
 void asm_builtin_exittrace();
 
+int asm_xadd(int *, int);
+
 #endif /* _ASMPART_H */
 
 
index 8c0cacd8872e3791f9a17ea12785ae2705176d33..3951e1a24651481c9a5ffa9f6bd32373f305e645 100644 (file)
@@ -29,7 +29,7 @@
             Reinhard Grafl
             Christian Thalinger
 
-   $Id: asmpart.S 771 2003-12-13 23:11:08Z stefan $
+   $Id: asmpart.S 779 2003-12-14 18:11:35Z stefan $
 
 */
 
@@ -1173,6 +1173,13 @@ asm_builtin_exittrace:
         popa
         ret
 
+asm_xadd:
+               mov 4(%esp),%ecx
+               mov 8(%esp),%eax
+               lock
+               xaddl %eax,0(%ecx)
+           incl %eax
+               ret
 
 /*
  * These are local overrides for various environment variables in Emacs.