too many changes: some cosmetic; some for 2/4; some for added options
authorceriel <none@none>
Mon, 21 Mar 1988 16:47:51 +0000 (16:47 +0000)
committerceriel <none@none>
Mon, 21 Mar 1988 16:47:51 +0000 (16:47 +0000)
lang/m2/comp/code.c

index d35e01c..1c85e5a 100644 (file)
@@ -178,16 +178,22 @@ CodeCoercion(t1, t2)
 {
        register int fund1, fund2;
        arith sz1 = t1->tp_size;
+       arith sz2;
 
        t1 = BaseType(t1);
        t2 = BaseType(t2);
+       sz2 = t2->tp_size;
        switch(fund1 = t1->tp_fund) {
        case T_WORD:
                fund1 = T_INTEGER;
                break;
        case T_CHAR:
-       case T_EQUAL:
        case T_ENUMERATION:
+       case T_CARDINAL:
+       case T_INTORCARD:
+               if (sz1 < word_size) sz1 = word_size;
+               /* fall through */
+       case T_EQUAL:
        case T_POINTER:
                fund1 = T_CARDINAL;
                break;
@@ -197,8 +203,10 @@ CodeCoercion(t1, t2)
                fund2 = T_INTEGER;
                break;
        case T_CHAR:
-       case T_EQUAL:
        case T_ENUMERATION:
+               sz2 = word_size;
+               /* fall through */
+       case T_EQUAL:
        case T_POINTER:
                fund2 = T_CARDINAL;
                break;
@@ -210,101 +218,83 @@ CodeCoercion(t1, t2)
                        c_loc((int)sz1);
                        c_loc((int) word_size);
                        C_cii();
+                       sz1 = word_size;
                }
-               switch(fund2) {
-               case T_INTEGER:
-#ifndef SQUEEZE
-                       if (t2->tp_size != t1->tp_size)
-#endif
-                       {
-                               c_loc((int)(t1->tp_size));
-                               c_loc((int)(t2->tp_size));
-                               C_cii();
-                       }
+               if (fund2 == T_REAL) {
+                       c_loc((int)sz1);
+                       c_loc((int)sz2);
+                       C_cif();
                        break;
-               case T_CARDINAL:
-#ifndef SQUEEZE
-                       if (t1->tp_size != word_size)
-#endif
-                       {
-                               c_loc((int)(t1->tp_size));
-                               c_loc((int) word_size);
+               }
+               if (sz2 != sz1) {
+                       c_loc((int)sz1);
+                       c_loc((int)sz2);
+                       switch(fund2) {
+                       case T_INTEGER:
+                               C_cii();
+                               break;
+                       case T_CARDINAL:
                                C_ciu();
+                               break;
+                       default:
+                               crash("Funny integer conversion");
                        }
-                       break;
-               case T_REAL:
-                       c_loc((int)(t1->tp_size));
-                       c_loc((int)(t2->tp_size));
-                       C_cif();
-                       break;
-               default:
-                       crash("Funny integer conversion");
                }
                break;
 
        case T_CARDINAL:
        case T_INTORCARD:
-               switch(fund2) {
-               case T_CARDINAL:
-               case T_INTORCARD:
-                       if (t2->tp_size > word_size) {
-                               c_loc((int) word_size);
-                               c_loc((int)(t2->tp_size));
-                               C_cuu();
-                       }
+               if (fund2 == T_REAL) {
+                       c_loc((int)sz1);
+                       c_loc((int)sz2);
+                       C_cuf();
                        break;
-               case T_INTEGER:
-                       if (fund1 == T_CARDINAL
-#ifndef SQUEEZE
-                           || t2->tp_size != word_size
-#endif
-                          ) {
-                               c_loc((int) word_size);
-                               c_loc((int)(t2->tp_size));
+               }
+               if (sz1 != sz2) {
+                       c_loc((int)sz1);
+                       c_loc((int)sz2);
+                       switch(fund2) {
+                       case T_CARDINAL:
+                       case T_INTORCARD:
+                               C_cuu();
+                               break;
+                       case T_INTEGER:
                                C_cui();
+                               break;
+                       default:
+                               crash("Funny cardinal conversion");
                        }
-                       break;
-               case T_REAL:
-                       c_loc((int) word_size);
-                       c_loc((int)(t2->tp_size));
-                       C_cuf();
-                       break;
-               default:
-                       crash("Funny cardinal conversion");
                }
                break;
 
        case T_REAL:
                switch(fund2) {
                case T_REAL:
-#ifndef SQUEEZE
-                       if (t2->tp_size != t1->tp_size)
-#endif
-                       {
-                               c_loc((int)(t1->tp_size));
-                               c_loc((int)(t2->tp_size));
+                       if (sz1 != sz2) {
+                               c_loc((int)sz1);
+                               c_loc((int)sz2);
                                C_cff();
                        }
                        break;
                case T_INTEGER:
-                       c_loc((int)(t1->tp_size));
-                       c_loc((int)(t2->tp_size));
+                       c_loc((int)sz1);
+                       c_loc((int)sz2);
                        C_cfi();
                        break;
                case T_CARDINAL:
                        if (! options['R']) {
                                label lb = ++text_label;
 
-                               C_dup(t1->tp_size);
-                               C_zrf(t1->tp_size);
-                               C_cmf(t1->tp_size);
+                               C_dup(sz1);
+                               C_zrf(sz1);
+                               C_cmf(sz1);
                                C_zge(lb);
                                c_loc(ECONV);
                                C_trp();
                                def_ilb(lb);
                        }
-                       c_loc((int)(t1->tp_size));
-                       c_loc((int)(t2->tp_size));
+                       c_loc((int)sz1);
+                       c_loc((int)sz2);
                        C_cfu();
                        break;
                default:
@@ -422,9 +412,7 @@ CodeParameters(param, arg)
                        C_loc(left_type->tp_size - 1);
                }
                else {
-                       arith lb, ub;
-                       getbounds(IndexType(left_type), &lb, &ub);
-                       C_loc(ub - lb);
+                       C_loc(left_type->arr_high - left_type->arr_low);
                }
                c_loc(0);
                if (left->nd_symb == STRING) {
@@ -696,6 +684,8 @@ CodeOper(expr, true_label, false_label)
                        break;
                case T_POINTER:
                case T_EQUAL:
+                       C_ads(rightop->nd_type->tp_size);
+                       break;
                case T_CARDINAL:
                case T_INTORCARD:
                        addu(tp->tp_size);
@@ -716,9 +706,14 @@ CodeOper(expr, true_label, false_label)
                case T_REAL:
                        C_sbf(tp->tp_size);
                        break;
+               case T_CARDINAL:
+                       if (rightop->nd_type == address_type) {
+                               C_sbs(pointer_size);
+                               break;
+                       }
+                       /* fall through */
                case T_POINTER:
                case T_EQUAL:
-               case T_CARDINAL:
                case T_INTORCARD:
                        subu(tp->tp_size);
                        break;
@@ -1101,7 +1096,8 @@ DoHIGH(df)
        assert(IsConformantArray(df->df_type));
 
        highoff = df->var_off           /* base address and descriptor */
-                 + 2 * word_size;      /* skip base and first field of
+                 + word_size + pointer_size;
+                                       /* skip base and first field of
                                           descriptor
                                        */
        if (df->df_scope->sc_level < proclevel) {