Proper x86_64 mnemonics
[cacao.git] / src / vm / builtin.c
index 0b9c1e73f265a87b56914b96eca6ed9113455859..9106a72553ed99c73257276477b3ddfb63d3d812 100644 (file)
@@ -416,7 +416,7 @@ bool builtintable_replace_function(void *iptr_)
 
 *******************************************************************************/
 
-s4 builtin_instanceof(java_handle_t *o, classinfo *class)
+bool builtin_instanceof(java_handle_t *o, classinfo *class)
 {
        classinfo *c;
 
@@ -439,7 +439,7 @@ s4 builtin_instanceof(java_handle_t *o, classinfo *class)
 
 *******************************************************************************/
 
-s4 builtin_checkcast(java_handle_t *o, classinfo *class)
+bool builtin_checkcast(java_handle_t *o, classinfo *class)
 {
        classinfo *c;
 
@@ -465,8 +465,7 @@ s4 builtin_checkcast(java_handle_t *o, classinfo *class)
                        
 *******************************************************************************/
 
-static s4 builtin_descriptorscompatible(arraydescriptor *desc,
-                                                                               arraydescriptor *target)
+static bool builtin_descriptorscompatible(arraydescriptor *desc, arraydescriptor *target)
 {
        if (desc == target)
                return 1;
@@ -480,6 +479,8 @@ static s4 builtin_descriptorscompatible(arraydescriptor *desc,
        /* {both arrays are arrays of references} */
 
        if (desc->dimension == target->dimension) {
+               if (!desc->elementvftbl)
+                       return 0;
                /* an array which contains elements of interface types is
            allowed to be casted to Object (JOWENN)*/
 
@@ -516,7 +517,7 @@ static s4 builtin_descriptorscompatible(arraydescriptor *desc,
 
 *******************************************************************************/
 
-s4 builtin_fast_arraycheckcast(java_object_t *o, classinfo *targetclass)
+bool builtin_fast_arraycheckcast(java_object_t *o, classinfo *targetclass)
 {
        arraydescriptor *desc;
 
@@ -538,7 +539,7 @@ s4 builtin_fast_arraycheckcast(java_object_t *o, classinfo *targetclass)
 
 *******************************************************************************/
 
-s4 builtin_fast_arrayinstanceof(java_object_t *o, classinfo *targetclass)
+bool builtin_fast_arrayinstanceof(java_object_t *o, classinfo *targetclass)
 {
        if (o == NULL)
                return 0;
@@ -553,9 +554,9 @@ s4 builtin_fast_arrayinstanceof(java_object_t *o, classinfo *targetclass)
 
 *******************************************************************************/
 
-s4 builtin_arrayinstanceof(java_handle_t *h, classinfo *targetclass)
+bool builtin_arrayinstanceof(java_handle_t *h, classinfo *targetclass)
 {
-       s4 result;
+       bool result;
 
        LLNI_CRITICAL_START;
 
@@ -635,9 +636,9 @@ java_object_t *builtin_retrieve_exception(void)
 
 *******************************************************************************/
 
-s4 builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
+bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
 {
-       int result;
+       bool result;
 
        LLNI_CRITICAL_START;
 
@@ -666,7 +667,16 @@ s4 builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
 
 *******************************************************************************/
 
-s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
+bool fast_subtype_check(struct _vftbl *s, struct _vftbl *t)
+{
+       if (s->subtype_display[t->subtype_depth] == t)
+               return true;
+       if (t->subtype_offset != OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE]))
+               return false;
+       return s->subtype_depth >= t->subtype_depth && s->subtype_overflow[t->subtype_depth - DISPLAY_SIZE] == t;
+}
+
+bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
 {
        arraydescriptor *desc;
        arraydescriptor *valuedesc;
@@ -674,7 +684,7 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
        vftbl_t         *valuevftbl;
        int32_t          baseval;
        uint32_t         diffval;
-       int              result;
+       bool             result;
 
        if (o == NULL)
                return 1;
@@ -698,8 +708,6 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
                if (valuevftbl == componentvftbl)
                        return 1;
 
-               LOCK_MONITOR_ENTER(linker_classrenumber_lock);
-
                baseval = componentvftbl->baseval;
 
                if (baseval <= 0) {
@@ -709,11 +717,8 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
                                          (valuevftbl->interfacetable[baseval] != NULL));
                }
                else {
-                       diffval = valuevftbl->baseval - componentvftbl->baseval;
-                       result  = diffval <= (uint32_t) componentvftbl->diffval;
+                       result = fast_subtype_check(valuevftbl, componentvftbl);
                }
-
-               LOCK_MONITOR_EXIT(linker_classrenumber_lock);
        }
        else if (valuedesc == NULL) {
                /* {oa has dimension > 1} */
@@ -736,14 +741,14 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
 
 
 /* This is an optimized version where a is guaranteed to be one-dimensional */
-s4 builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
+bool builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
 {
        arraydescriptor *desc;
        vftbl_t         *elementvftbl;
        vftbl_t         *valuevftbl;
        int32_t          baseval;
        uint32_t         diffval;
-       int              result;
+       bool             result;
        
        if (o == NULL)
                return 1;
@@ -765,8 +770,6 @@ s4 builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
        if (valuevftbl == elementvftbl)
                return 1;
 
-       LOCK_MONITOR_ENTER(linker_classrenumber_lock);
-
        baseval = elementvftbl->baseval;
 
        if (baseval <= 0) {
@@ -775,24 +778,21 @@ s4 builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
                                  (valuevftbl->interfacetable[baseval] != NULL));
        }
        else {
-               diffval = valuevftbl->baseval - elementvftbl->baseval;
-               result  = diffval <= (uint32_t) elementvftbl->diffval;
+               result = fast_subtype_check(valuevftbl, elementvftbl);
        }
 
-       LOCK_MONITOR_EXIT(linker_classrenumber_lock);
-
        return result;
 }
 
 
 /* This is an optimized version where a is guaranteed to be a
  * one-dimensional array of a class type */
-s4 builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o)
+bool builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o)
 {
        vftbl_t  *elementvftbl;
        vftbl_t  *valuevftbl;
        uint32_t  diffval;
-       int       result;
+       bool      result;
        
        if (o == NULL)
                return 1;
@@ -814,12 +814,7 @@ s4 builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o)
        if (valuevftbl == elementvftbl)
                return 1;
 
-       LOCK_MONITOR_ENTER(linker_classrenumber_lock);
-
-       diffval = valuevftbl->baseval - elementvftbl->baseval;
-       result  = diffval <= (uint32_t) elementvftbl->diffval;
-
-       LOCK_MONITOR_EXIT(linker_classrenumber_lock);
+       result = fast_subtype_check(valuevftbl, elementvftbl);
 
        return result;
 }
@@ -992,7 +987,7 @@ java_object_t *builtin_fast_new(classinfo *c)
 
 *******************************************************************************/
 
-java_handle_t *builtin_newarray(s4 size, classinfo *arrayclass)
+java_handle_t *builtin_newarray(int32_t size, classinfo *arrayclass)
 {
        arraydescriptor *desc;
        s4               dataoffset;
@@ -1055,7 +1050,7 @@ java_handle_t *builtin_newarray(s4 size, classinfo *arrayclass)
 
 *******************************************************************************/
 
-java_handle_t *builtin_java_newarray(s4 size, java_handle_t *arrayclazz)
+java_handle_t *builtin_java_newarray(int32_t size, java_handle_t *arrayclazz)
 {
        return builtin_newarray(size, LLNI_classinfo_unwrap(arrayclazz));
 }
@@ -1073,7 +1068,7 @@ java_handle_t *builtin_java_newarray(s4 size, java_handle_t *arrayclazz)
 
 *******************************************************************************/
 
-java_handle_objectarray_t *builtin_anewarray(s4 size, classinfo *componentclass)
+java_handle_objectarray_t *builtin_anewarray(int32_t size, classinfo *componentclass)
 {
        classinfo *arrayclass;
        
@@ -1108,7 +1103,7 @@ java_handle_objectarray_t *builtin_anewarray(s4 size, classinfo *componentclass)
 *******************************************************************************/
 
 #define BUILTIN_NEWARRAY_TYPE(type, arraytype)                             \
-java_handle_##type##array_t *builtin_newarray_##type(s4 size)              \
+java_handle_##type##array_t *builtin_newarray_##type(int32_t size)              \
 {                                                                          \
        return (java_handle_##type##array_t *)                                 \
                builtin_newarray(size, primitivetype_table[arraytype].arrayclass); \