fixed several bugs with object sizes
authoreck <none@none>
Tue, 14 Aug 1990 09:59:37 +0000 (09:59 +0000)
committereck <none@none>
Tue, 14 Aug 1990 09:59:37 +0000 (09:59 +0000)
lang/pc/comp/code.c
lang/pc/comp/desig.c

index 6880060..ebdfcc8 100644 (file)
@@ -264,10 +264,14 @@ CodeEndBlock(df, StackAdjustment)
                                        C_cal("_nfa");
                                        C_asp(word_size);
                                }
+                               if( tp->tp_size == word_size )
+                                       C_lol(-tp->tp_size);
                                if( tp->tp_size == 2 * word_size )
                                        C_ldl(-tp->tp_size);
-                               else
-                                       C_lol(-tp->tp_size);
+                               else {
+                                       C_lal(-tp->tp_size);
+                                       C_loi(tp->tp_size);
+                               }
 
                                C_ret(tp->tp_size);
                        }
index 8744c07..2aa9695 100644 (file)
@@ -164,12 +164,20 @@ CodeValue(ds, tp)
                break;
 
        case DSG_FIXED:
-               if( ds->dsg_offset % word_size == 0 && size == word_size ) {
-                       if( ds->dsg_name )
-                               C_loe_dnam(ds->dsg_name, ds->dsg_offset);
-                       else
-                               C_lol(ds->dsg_offset);
-                       break;
+               if( ds->dsg_offset % word_size == 0 ) {
+                       if ( size == word_size ) {
+                               if( ds->dsg_name )
+                                       C_loe_dnam(ds->dsg_name, ds->dsg_offset);
+                               else
+                                       C_lol(ds->dsg_offset);
+                               break;
+                       } else if ( size == word_size * 2) {
+                               if( ds->dsg_name )
+                                       C_lde_dnam(ds->dsg_name, ds->dsg_offset);
+                               else
+                                       C_ldl(ds->dsg_offset);
+                               break;
+                       }
                }
                /* Fall through */
        case DSG_PLOADED:
@@ -209,12 +217,20 @@ CodeStore(ds, tp)
        
        switch( ds->dsg_kind )  {
        case DSG_FIXED:
-               if( ds->dsg_offset % word_size == 0 && size == word_size ) {
-                       if( ds->dsg_name )
-                               C_ste_dnam(ds->dsg_name, ds->dsg_offset);
-                       else
-                               C_stl(ds->dsg_offset);
-                       break;
+               if( ds->dsg_offset % word_size == 0 ) {
+                       if ( size == word_size ) {
+                               if( ds->dsg_name )
+                                       C_ste_dnam(ds->dsg_name, ds->dsg_offset);
+                               else
+                                       C_stl(ds->dsg_offset);
+                               break;
+                       } else if ( size == word_size * 2) {
+                               if( ds->dsg_name )
+                                       C_sde_dnam(ds->dsg_name, ds->dsg_offset);
+                               else
+                                       C_sdl(ds->dsg_offset);
+                               break;
+                       }
                }
                /* Fall through */
        case DSG_PLOADED:
@@ -263,11 +279,19 @@ CodeAddress(ds)
                break;
                
        case DSG_PFIXED:
-               if( ds->dsg_name )
-                       C_loe_dnam(ds->dsg_name, ds->dsg_offset);
-               else
-                       C_lol(ds->dsg_offset);
-               break;
+               if ( word_size == pointer_size ) {
+                       if( ds->dsg_name )
+                               C_loe_dnam(ds->dsg_name, ds->dsg_offset);
+                       else
+                               C_lol(ds->dsg_offset);
+                       break;
+               } else {
+                       if( ds->dsg_name )
+                               C_lde_dnam(ds->dsg_name, ds->dsg_offset);
+                       else
+                               C_ldl(ds->dsg_offset);
+                       break;
+               }
 
        case DSG_INDEXED:
                C_aar(word_size);