Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
fold_drive.c
Go to the documentation of this file.
00001 /*
00002 
00003   Copyright (C) 2000, 2001 Silicon Graphics, Inc.  All Rights Reserved.
00004 
00005   This program is free software; you can redistribute it and/or modify it
00006   under the terms of version 2 of the GNU General Public License as
00007   published by the Free Software Foundation.
00008 
00009   This program is distributed in the hope that it would be useful, but
00010   WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013   Further, this software is distributed without any warranty that it is
00014   free of the rightful claim of any third person regarding infringement 
00015   or the like.  Any license provided herein, whether implied or 
00016   otherwise, applies only to this software file.  Patent licenses, if 
00017   any, provided herein do not apply to combinations of this program with 
00018   other software, or any other product whatsoever.  
00019 
00020   You should have received a copy of the GNU General Public License along
00021   with this program; if not, write the Free Software Foundation, Inc., 59
00022   Temple Place - Suite 330, Boston MA 02111-1307, USA.
00023 
00024   Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pky,
00025   Mountain View, CA 94043, or:
00026 
00027   http://www.sgi.com
00028 
00029   For further information regarding this notice, see:
00030 
00031   http://oss.sgi.com/projects/GenInfo/NoticeExplan
00032 
00033 */
00034 
00035 
00036 
00037 static char USMID[] = "\n@(#)5.0_pl/sources/fold_drive.c        5.19    10/14/99 14:09:57\n";
00038 
00039 # include <stdarg.h>
00040 # include "defines.h"           /* Machine dependent ifdefs */
00041 # include "host.m"              /* Host machine dependent macros.*/
00042 # include "host.h"              /* Host machine dependent header.*/
00043 # include "target.m"            /* Target machine dependent macros.*/
00044 # include "target.h"            /* Target machine dependent header.*/
00045 # include "globals.m"
00046 # include "tokens.m"
00047 # include "sytb.m"
00048 # include "s_globals.m"
00049 # include "debug.m"
00050 # include "fold_drive.m"
00051 # include "globals.h"
00052 # include "tokens.h"
00053 # include "sytb.h"
00054 # include "s_globals.h"
00055 # include "fmath.h"
00056 # include "arith.h"
00057 # include "fold_drive.h"
00058 
00059 /* This function has Fortran linkage. */
00060 #if defined(__GNUC__) && defined(__alpha)
00061   /* GCC alpha is different for some reason... */
00062 # define FOLD_OPERATION fold_operation__
00063 #else
00064 # define FOLD_OPERATION fold_operation_
00065 #endif
00066 
00067 
00068 /******************************************************************************\
00069 |*                                                                            *|
00070 |* Description:                                                               *|
00071 |*      Compare a constant table entry with a "c" long value according to     *|
00072 |*      the relational operator "opr".                                        *|
00073 |*      NOTE:  This does not handle values bigger than a long on the host     *|
00074 |*             machine.  Call folder_driver directly for that.                *|
00075 |*                                                                            *|
00076 |* Input parameters:                                                          *|
00077 |*      NONE                                                                  *|
00078 |*                                                                            *|
00079 |* Output parameters:                                                         *|
00080 |*      NONE                                                                  *|
00081 |*                                                                            *|
00082 |* Returns:                                                                   *|
00083 |*      NOTHING                                                               *|
00084 |*                                                                            *|
00085 \******************************************************************************/
00086 boolean compare_cn_and_value(int        cn_idx,
00087 #if defined(_HOST32) && defined(_TARGET64)
00088                              long long  value,
00089 #else
00090                              long       value,
00091 #endif
00092                              int        opr)
00093 
00094 {
00095    long_type            result[MAX_WORDS_FOR_NUMERIC];
00096    long_type            right_value[MAX_WORDS_FOR_NUMERIC];
00097    boolean              is_true                                 = FALSE;
00098    int                  type_idx;
00099 
00100 
00101    TRACE (Func_Entry,"compare_cn_and_value" , NULL);
00102 
00103    C_TO_F_INT(right_value, value, CG_INTEGER_DEFAULT_TYPE);
00104 
00105    type_idx = CG_LOGICAL_DEFAULT_TYPE;
00106 
00107    if (folder_driver((char *)&CN_CONST(cn_idx),
00108                      CN_TYPE_IDX(cn_idx),
00109                      (char *)&right_value,
00110 # ifdef _WHIRL_HOST64_TARGET64
00111                      Integer_8,
00112 # else
00113                      CG_INTEGER_DEFAULT_TYPE,
00114 # endif /* _WHIRL_HOST64_TARGET64 */
00115                      result,
00116                      &type_idx,
00117                      stmt_start_line,
00118                      stmt_start_col,
00119                      2,
00120                      opr)) {
00121 
00122       if (THIS_IS_TRUE(result, type_idx)) {
00123          is_true = TRUE;
00124       }
00125    }
00126 
00127    TRACE (Func_Exit, "compare_cn_and_value", NULL);
00128 
00129    return(is_true);
00130 
00131 }  /* compare_cn_and_value */
00132 
00133 
00134 /******************************************************************************\
00135 |*                                                                            *|
00136 |* Description:                                                               *|
00137 |*      This routine compares two character strings according to the f90 rules*|
00138 |*                                                                            *|
00139 |* Input parameters:                                                          *|
00140 |*      NONE                                                                  *|
00141 |*                                                                            *|
00142 |* Output parameters:                                                         *|
00143 |*      NONE                                                                  *|
00144 |*                                                                            *|
00145 |* Returns:                                                                   *|
00146 |*      returns the TRUE_VALUE or FALSE_VALUE depending on the result of      *|
00147 |*      the compare and the operation requested.                              *|
00148 |*                                                                            *|
00149 \******************************************************************************/
00150 static void f90_character_compare(char          *ch_ptr1,
00151                                   long64         len1,
00152                                   char          *ch_ptr2,
00153                                   long64         len2,
00154                                   int            opr,
00155                                   long_type     *result,
00156                                   int            type_idx)
00157 
00158 {
00159    char                 char1;
00160    char                 char2;
00161    int                  comp_result = 0;
00162    long64               i;
00163 
00164 
00165    TRACE (Func_Entry, "f90_character_compare", NULL);
00166 
00167    set_up_logical_constant(result, type_idx, FALSE_VALUE, FALSE);
00168 
00169    for (i = 0; i < (len1 > len2 ? len1 : len2); i++) {
00170 
00171       if (i < len1) {
00172          char1 = ch_ptr1[i];
00173       }
00174       else {
00175          char1 = ' ';
00176       }
00177 
00178       if (i < len2) {
00179          char2 = ch_ptr2[i];
00180       }
00181       else {
00182          char2 = ' ';
00183       }
00184 
00185       if (char1 == char2) {
00186          /* intentionally blank */
00187       }
00188       else if (char1 < char2) {
00189          comp_result = -1;
00190          break;
00191       }
00192       else if (char1 > char2) {
00193          comp_result = 1;
00194          break;
00195       }
00196    }
00197    
00198 
00199    switch (opr) {
00200    case Eq_Opr :
00201 
00202       if (comp_result == 0) {
00203          set_up_logical_constant(result, type_idx, TRUE_VALUE, FALSE);
00204       }
00205       break;
00206 
00207    case Ne_Opr :
00208 
00209       if (comp_result != 0) {
00210          set_up_logical_constant(result, type_idx, TRUE_VALUE, FALSE);
00211       }
00212       break;
00213 
00214    case Lt_Opr :
00215 
00216       if (comp_result < 0) {
00217          set_up_logical_constant(result, type_idx, TRUE_VALUE, FALSE);
00218       }
00219       break;
00220 
00221    case Le_Opr :
00222 
00223       if (comp_result <= 0) {
00224          set_up_logical_constant(result, type_idx, TRUE_VALUE, FALSE);
00225       }
00226       break;
00227 
00228    case Gt_Opr :
00229 
00230       if (comp_result > 0) {
00231          set_up_logical_constant(result, type_idx, TRUE_VALUE, FALSE);
00232       }
00233       break;
00234 
00235    case Ge_Opr :
00236 
00237       if (comp_result >= 0) {
00238          set_up_logical_constant(result, type_idx, TRUE_VALUE, FALSE);
00239       }
00240       break;
00241 
00242    }
00243 
00244    TRACE (Func_Exit, "f90_character_compare", NULL);
00245 
00246    return;
00247 
00248 }  /* f90_character_compare */
00249 
00250 
00251 /******************************************************************************\
00252 |*                                                                            *|
00253 |* Description:                                                               *|
00254 |*      <description>                                                         *|
00255 |*                                                                            *|
00256 |* Input parameters:                                                          *|
00257 |*      NONE                                                                  *|
00258 |*                                                                            *|
00259 |* Output parameters:                                                         *|
00260 |*      NONE                                                                  *|
00261 |*                                                                            *|
00262 |* Returns:                                                                   *|
00263 |*      NOTHING                                                               *|
00264 |*                                                                            *|
00265 \******************************************************************************/
00266 boolean folder_driver(char              *l_value_ptr,
00267                       int                l_type_idx,
00268                       char              *r_value_ptr,
00269                       int                r_type_idx,
00270                       long_type         *result,
00271                       int               *res_type_idx,
00272                       int                line,
00273                       int                col,
00274                       int                num_args,
00275                       int                opr,
00276                       ...)
00277 
00278 {
00279    struct value_entry     { long_type     v[MAX_WORDS_FOR_NUMERIC]; };
00280 
00281    typedef struct         value_entry     value_type;
00282 
00283    struct big_value_entry { long_type     v[2000]; };
00284 
00285    typedef struct         big_value_entry big_value_type;
00286 
00287    boolean                      ok                      = TRUE;
00288    long64                       count;
00289    big_value_type               l_value;
00290    value_type                   r_value;
00291    value_type                   a3_value;
00292    value_type                   a4_value;
00293    value_type                   str_len1;
00294    value_type                   str_len2;
00295    big_value_type               loc_result;
00296    long64                       i;
00297    int                          j;
00298    int                          k;
00299    int                          cn_idx;
00300    int                          cn_idx1;
00301    int                          cn_idx2;
00302    long64                       length;
00303    long64                       length_o;
00304    long64                       length_d;
00305    linear_type_type             l_linear_type;
00306    linear_type_type             r_linear_type;
00307    linear_type_type             a3_linear_type;
00308    linear_type_type             a4_linear_type;
00309    linear_type_type             res_linear_type;
00310    linear_type_type             str1_linear_type;
00311    linear_type_type             str2_linear_type;
00312    long_type                    mask;
00313    char                        *a3_value_ptr;
00314    int                          a3_type_idx;
00315    char                        *a4_value_ptr;
00316    int                          a4_type_idx;
00317    va_list                      arg_ptr;
00318    char                         char_buf[8000];
00319    int                          type_idx;
00320    int                          char_idx;
00321    int                          tmp_opr;
00322    char                        *char_ptr;
00323    long                         arith_type;
00324    long                         arith_type_l;
00325    AR_COMPARE_TYPE              comp_res;
00326    long64                       char_len;
00327 
00328 
00329    TRACE (Func_Entry, "folder_driver", NULL);
00330 
00331    if (l_type_idx != NULL_IDX) {
00332       l_linear_type = TYP_LINEAR(l_type_idx);
00333    }
00334 
00335    res_linear_type = TYP_LINEAR(*res_type_idx);
00336 
00337    if (num_args > 1 && r_type_idx != NULL_IDX) {
00338       r_linear_type = TYP_LINEAR(r_type_idx);
00339    }
00340 
00341    if (num_args > 2) {
00342       va_start (arg_ptr, opr);
00343       a3_value_ptr = va_arg(arg_ptr, char *);
00344       a3_type_idx  = va_arg(arg_ptr, long);
00345       a4_value_ptr = va_arg(arg_ptr, char *);
00346       a4_type_idx  = va_arg(arg_ptr, long);
00347       va_end(arg_ptr);
00348 
00349       if (a3_type_idx != NULL_IDX) {
00350          a3_linear_type = TYP_LINEAR(a3_type_idx);
00351       }
00352 
00353       if (num_args == 4 &&
00354           a4_type_idx != NULL_IDX) {
00355 
00356          a4_linear_type = TYP_LINEAR(a4_type_idx);
00357       }
00358    }
00359 
00360    if ((opr == SRK_Opr) || 
00361        (opr == Transfer_Opr) || 
00362        (opr == Reshape_Opr)) {
00363       goto CONTINUE;
00364    }
00365 
00366    /* copy arguments to local variables so that addresses of */
00367    /* constant tbl entries can be sent.                      */
00368 
00369    if (TYP_TYPE(l_type_idx) == Typeless) {
00370       for (i = 0; 
00371            i < ((TYP_BIT_LEN(l_type_idx) + TARGET_BITS_PER_WORD - 1)/
00372                 TARGET_BITS_PER_WORD); 
00373            i++) {
00374          l_value.v[i] = ((long_type *)l_value_ptr)[i];
00375       }
00376    }
00377    else if (TYP_TYPE(l_type_idx) != Character) {
00378       for (i = 0; i < num_host_wds[TYP_LINEAR(l_type_idx)]; i++) {
00379          l_value.v[i] = ((long_type *)l_value_ptr)[i];
00380       }
00381 
00382 # ifdef _TARGET_OS_MAX
00383       if (l_linear_type == Complex_4) {
00384          /* we need to pack it up into one word */
00385          l_value.v[0] = l_value.v[0] << 32;
00386          l_value.v[0] = l_value.v[0] | (l_value.v[1] & 0xFFFFFFFF);
00387       }
00388 # endif
00389    }
00390    else {  /* processing character data */
00391       char_ptr = (char *)l_value.v;
00392       l_value.v[0] = 0;
00393 
00394       for (i = 0; i < CN_INT_TO_C(TYP_IDX(l_type_idx)); i++) {
00395          char_ptr[i] = l_value_ptr[i];
00396       }
00397 
00398       for ( ; i < TARGET_BYTES_PER_WORD; i++) {
00399          char_ptr[i] = ' ';
00400       }
00401    }
00402 
00403    if (num_args > 1) {
00404 
00405       if (TYP_TYPE(r_type_idx) == Typeless) {
00406 
00407          for (i = 0; 
00408               i < ((TYP_BIT_LEN(r_type_idx) + TARGET_BITS_PER_WORD - 1)/
00409                    TARGET_BITS_PER_WORD); 
00410               i++) {
00411 
00412             r_value.v[i] = ((long_type *)r_value_ptr)[i];
00413          }
00414       }
00415       else if (TYP_TYPE(r_type_idx) != Character) {
00416 
00417          for (i = 0; i < num_host_wds[TYP_LINEAR(r_type_idx)]; i++) {
00418             r_value.v[i] = ((long_type *)r_value_ptr)[i];
00419          }
00420 
00421 # ifdef _TARGET_OS_MAX
00422          if (r_linear_type == Complex_4) {
00423             /* we need to pack it up into one word */
00424             r_value.v[0] = r_value.v[0] << 32;
00425             r_value.v[0] = r_value.v[0] | (r_value.v[1] & 0xFFFFFFFF);
00426          }
00427 # endif
00428       }
00429       else {
00430          char_ptr = (char *)r_value.v;
00431          r_value.v[0] = 0;
00432 
00433          for (i = 0; i < CN_INT_TO_C(TYP_IDX(r_type_idx)) &&
00434                      i < TARGET_BYTES_PER_WORD;
00435               i++) {
00436             char_ptr[i] = r_value_ptr[i];
00437          }
00438 
00439          for ( ; i < TARGET_BYTES_PER_WORD; i++) {
00440             char_ptr[i] = ' ';
00441          }
00442       }
00443    }
00444 
00445    if (num_args > 2) {
00446 
00447       if (TYP_TYPE(a3_type_idx) == Typeless) {
00448 
00449          for (i = 0; 
00450               i < ((TYP_BIT_LEN(a3_type_idx) + TARGET_BITS_PER_WORD - 1)/
00451                    TARGET_BITS_PER_WORD); 
00452               i++) {
00453 
00454             a3_value.v[i] = ((long_type *)a3_value_ptr)[i];
00455          }
00456       }
00457       else if (TYP_TYPE(a3_type_idx) != Character) {
00458 
00459          for (i = 0; i < num_host_wds[a3_linear_type]; i++) {
00460             a3_value.v[i] = ((long_type *)a3_value_ptr)[i];
00461          }
00462 
00463 # ifdef _TARGET_OS_MAX
00464          if (a3_linear_type == Complex_4) {
00465             /* we need to pack it up into one word */
00466             a3_value.v[0] = a3_value.v[0] << 32;
00467             a3_value.v[0] = a3_value.v[0] | (a3_value.v[1] & 0xFFFFFFFF);
00468          }
00469 # endif
00470       }
00471       else {
00472          char_ptr = (char *)a3_value.v;
00473          a3_value.v[0] = 0;
00474 
00475          for (i = 0; i < CN_INT_TO_C(TYP_IDX(a3_type_idx)) &&
00476                      i < TARGET_BYTES_PER_WORD;
00477               i++) {
00478             char_ptr[i] = a3_value_ptr[i];
00479          }
00480 
00481          for ( ; i < TARGET_BYTES_PER_WORD; i++) {
00482             char_ptr[i] = ' ';
00483          }
00484       }
00485    }
00486 
00487    if (num_args > 3) {
00488 
00489       if (TYP_TYPE(a4_type_idx) == Typeless) {
00490 
00491          for (i = 0;
00492               i < ((TYP_BIT_LEN(a4_type_idx) + TARGET_BITS_PER_WORD - 1)/
00493                    TARGET_BITS_PER_WORD);
00494               i++) {
00495 
00496             a4_value.v[i] = ((long_type *)a4_value_ptr)[i];
00497          }
00498       }
00499       else if (TYP_TYPE(a4_type_idx) != Character) {
00500 
00501          for (i = 0; i < num_host_wds[a4_linear_type]; i++) {
00502             a4_value.v[i] = ((long_type *)a4_value_ptr)[i];
00503          }
00504 
00505 # ifdef _TARGET_OS_MAX
00506          if (a4_linear_type == Complex_4) {
00507             /* we need to pack it up into one word */
00508             a4_value.v[0] = a4_value.v[0] << 32;
00509             a4_value.v[0] = a4_value.v[0] | (a4_value.v[1] & 0xFFFFFFFF);
00510          }
00511 # endif
00512       }
00513       else {
00514          char_ptr = (char *)a4_value.v;
00515          a4_value.v[0] = 0;
00516 
00517          for (i = 0; i < CN_INT_TO_C(TYP_IDX(a4_type_idx)) &&
00518                      i < TARGET_BYTES_PER_WORD;
00519               i++) {
00520             char_ptr[i] = a4_value_ptr[i];
00521          }
00522 
00523          for ( ; i < TARGET_BYTES_PER_WORD; i++) {
00524             char_ptr[i] = ' ';
00525          }
00526       }
00527    }
00528 
00529 
00530 CONTINUE:
00531 
00532    switch (opr) {
00533       case Reshape_Opr :
00534          mask = AR_reshape((void *)result,
00535                            (const void *)l_value_ptr,
00536                            (const void *)r_value_ptr,
00537                            (const void *)a3_value_ptr,
00538                            (const void *)a4_value_ptr);
00539 
00540          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
00541 
00542          goto EXIT; /* goto exit because this returns a dope vector. */
00543 
00544 
00545       case Transfer_Opr :
00546          if (a3_value_ptr != NULL) {
00547             for (i = 0; i < num_host_wds[a3_linear_type]; i++) {
00548                a3_value.v[i] = ((long_type *)a3_value_ptr)[i];
00549             }
00550             SHIFT_ARITH_ARG(a3_value.v, a3_linear_type);
00551 
00552             mask = AR_transfer((void *)result,
00553                            (const void *)l_value_ptr,
00554                            (const void *)r_value_ptr,
00555                            (const AR_DATA *)a3_value.v,
00556                            (const AR_TYPE *)&linear_to_arith[a3_linear_type]);
00557          }
00558          else {
00559             mask = AR_transfer((void *)result,
00560                            (const void *)l_value_ptr,
00561                            (const void *)r_value_ptr,
00562                            (const AR_DATA *)a3_value_ptr,
00563                       (const AR_TYPE *)&linear_to_arith[INTEGER_DEFAULT_TYPE]);
00564          }
00565 
00566          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
00567 
00568          goto EXIT; /* goto exit because this returns a dope vector. */
00569 
00570 
00571       case Trim_Opr :
00572          /* Do this inline */
00573          /* return a cn table index in result[0] */
00574  
00575          i = CN_INT_TO_C(TYP_IDX(l_type_idx));
00576          while (i > 0 && l_value_ptr[i-1] == ' ') {
00577             i--;
00578          }
00579          
00580          char_len = i;
00581 
00582          CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00583          TYP_TYPE(TYP_WORK_IDX) = Character;
00584          TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
00585          TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
00586          TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
00587          TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(NULL_IDX, char_len);
00588          *res_type_idx = ntr_type_tbl();
00589 
00590          result[0] = ntr_const_tbl((*res_type_idx), TRUE, NULL);
00591          char_ptr = (char *) &CN_CONST(result[0]);
00592 
00593          for (i = 0; i < char_len; i++) {
00594             char_ptr[i] = l_value_ptr[i];
00595          }
00596 
00597          break;
00598 
00599 
00600       case Repeat_Opr :
00601 
00602          /* do this inline. */
00603 
00604          /* JEFFL BRIANJ - Do changes need to be made here? */
00605 
00606          length = CP_CONSTANT(CN_POOL_IDX(TYP_IDX(l_type_idx)) +
00607                num_host_wds[TYP_LINEAR(CN_TYPE_IDX(TYP_IDX(l_type_idx)))] - 1);
00608  
00609          count = r_value.v[num_host_wds[r_linear_type] - 1];
00610 
00611          length = length * count;
00612 
00613          CLEAR_TBL_NTRY(type_tbl, TYP_WORK_IDX);
00614          TYP_TYPE(TYP_WORK_IDX) = Character;
00615          TYP_LINEAR(TYP_WORK_IDX) = CHARACTER_DEFAULT_TYPE;
00616          TYP_CHAR_CLASS(TYP_WORK_IDX) = Const_Len_Char;
00617          TYP_FLD(TYP_WORK_IDX) = CN_Tbl_Idx;
00618          TYP_IDX(TYP_WORK_IDX) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, length),
00619          *res_type_idx = ntr_type_tbl();
00620 
00621          result[0] = ntr_const_tbl((*res_type_idx), TRUE, NULL);
00622          char_ptr = (char *) &CN_CONST(result[0]);
00623 
00624          length = CP_CONSTANT(CN_POOL_IDX(TYP_IDX(l_type_idx)) +
00625                num_host_wds[TYP_LINEAR(CN_TYPE_IDX(TYP_IDX(l_type_idx)))] - 1);
00626  
00627          char_idx = 0;
00628          for (k = 0; k < count; k++) {
00629             for (i = 0; i < length; i++) {
00630                char_ptr[char_idx] = l_value_ptr[i];
00631                char_idx++;
00632             }
00633          }
00634          break;
00635 
00636 
00637       case SRK_Opr :
00638 
00639      if (l_value_ptr!=NULL)
00640        for (i = 0; i < num_host_wds[l_linear_type]; i++) {
00641                l_value.v[i] = ((long_type *)l_value_ptr)[i];
00642             }
00643 
00644      if (r_value_ptr!=NULL)
00645        for (i = 0; i < num_host_wds[r_linear_type]; i++) {
00646               r_value.v[i] = ((long_type *)r_value_ptr)[i];
00647             }
00648 
00649  
00650        if (l_value_ptr!=NULL && r_value_ptr!=NULL) {
00651           cn_idx1 = ntr_const_tbl(l_type_idx, FALSE, &l_value.v[0]);
00652           cn_idx2 = ntr_const_tbl(r_type_idx, FALSE, &r_value.v[0]);
00653           if (compare_cn_and_value(cn_idx1,PRECISION_REAL4_F90,Le_Opr)) {
00654                if (compare_cn_and_value(cn_idx2,RANGE_REAL4_F90,Le_Opr)) {
00655                   i=4;
00656                }
00657                else if (compare_cn_and_value(cn_idx2,RANGE_REAL8_F90,Le_Opr)) {
00658                   i=8;
00659                }
00660                else {
00661                   i=-2;
00662                }
00663            }
00664            else if (compare_cn_and_value(cn_idx1,PRECISION_REAL8_F90,Le_Opr)) {    
00665                   if (compare_cn_and_value(cn_idx2,RANGE_REAL8_F90,Le_Opr)) {
00666                    i=8;
00667                   } else {
00668                    i=-2; 
00669                   }
00670            }
00671            else if (compare_cn_and_value(cn_idx1,PRECISION_REAL16_F90,Le_Opr)) { 
00672                   if (compare_cn_and_value(cn_idx2,RANGE_REAL16_F90,Le_Opr)) {
00673                    i=16;
00674                  } else {
00675                    i=-2;
00676                  }
00677             }
00678            else if(compare_cn_and_value(cn_idx2,RANGE_REAL8_F90,Le_Opr)) {
00679                  i=-1;
00680                  } else {
00681                  i=-3;
00682                  }
00683         }
00684 
00685 
00686       if (l_value_ptr!=NULL && r_value_ptr==NULL) {
00687         cn_idx1 = ntr_const_tbl(l_type_idx, FALSE, &l_value.v[0]);
00688         if (compare_cn_and_value(cn_idx1,PRECISION_REAL4_F90,Le_Opr)) {
00689             i=4;
00690         } else 
00691         if (compare_cn_and_value(cn_idx1,PRECISION_REAL8_F90,Le_Opr)) {
00692             i=8;
00693         } else 
00694          if (compare_cn_and_value(cn_idx1,PRECISION_REAL16_F90,Le_Opr)) {
00695             i=16;
00696         } else 
00697             i=-1;
00698      }
00699  
00700      if (l_value_ptr==NULL && r_value_ptr!=NULL) {
00701       cn_idx2 = ntr_const_tbl(r_type_idx, FALSE, &r_value.v[0]);
00702       if (compare_cn_and_value(cn_idx2,RANGE_REAL4_F90,Le_Opr)) {
00703          i=4; }
00704       else
00705       if (compare_cn_and_value(cn_idx2,RANGE_REAL8_F90,Le_Opr)) {
00706          i=8; }
00707       else
00708          i=-2; 
00709      }
00710 
00711        C_TO_F_INT(result, i, res_linear_type);
00712 
00713 
00714     if (FALSE) {    
00715 
00716 
00717 
00718          if (r_value_ptr == NULL) {
00719 
00720             for (i = 0; i < num_host_wds[l_linear_type]; i++) {
00721                l_value.v[i] = ((long_type *)l_value_ptr)[i];
00722             }
00723 
00724             if (l_linear_type != res_linear_type) {
00725                SHIFT_ARITH_ARG(l_value.v, l_linear_type);
00726 
00727  # if defined(_USE_FOLD_DOT_f)
00728                tmp_opr = Cvrt_Opr;
00729                FOLD_OPERATION(
00730                               &tmp_opr, 
00731                               &loc_result.v,
00732                               &res_linear_type,
00733                               &l_value.v,
00734                               &l_linear_type,
00735                               &r_value.v,
00736                               &r_linear_type, 
00737                               &a3_value.v,
00738                               &a3_linear_type);
00739  # else
00740                mask = AR_convert((AR_DATA *)loc_result.v,
00741                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
00742                             (const AR_DATA *)l_value.v,
00743                             (const AR_TYPE *)&linear_to_arith[l_linear_type]);
00744  # endif
00745 
00746                ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
00747                SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
00748 
00749                for (i = 0; i < num_host_wds[res_linear_type]; i++) {
00750                   l_value.v[i] = loc_result.v[i];
00751                }
00752             }
00753 
00754             r_linear_type = Err_Res;
00755 
00756 /*            SHIFT_ARITH_ARG(l_value.v, res_linear_type); */
00757 
00758 /* SELECTED_REAL_KIND instrinc function implementation in fold.f
00759  * is removed because Linux doesn't have F90 compiler, use AR_xxx
00760  * implemenation in arith.a instead!
00761  */ 
00762 # if 0 
00763             FOLD_OPERATION(
00764                               &opr, 
00765                               &loc_result.v,
00766                               &res_linear_type,
00767                               &l_value.v,
00768                               &l_linear_type,
00769                               &r_value.v,
00770                               &r_linear_type, 
00771                               &a3_value.v,
00772                               &a3_linear_type);
00773 # else
00774             mask = AR_selected_real_kind((AR_DATA *)loc_result.v,
00775                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
00776                         (const AR_DATA *)l_value.v,
00777                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
00778                         (const AR_DATA *)NULL,
00779                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
00780 # endif
00781    
00782          }
00783          else if (l_value_ptr == NULL) {
00784             for (i = 0; i < num_host_wds[r_linear_type]; i++) {
00785               r_value.v[i] = ((long_type *)r_value_ptr)[i];
00786              ((long_type *)r_value_ptr)[i]=r_value.v[i]; /* fff */
00787             }
00788 
00789             if (r_linear_type != res_linear_type) { 
00790                SHIFT_ARITH_ARG(r_value.v, r_linear_type);
00791 
00792 # if defined(_USE_FOLD_DOT_f)
00793                tmp_opr = Cvrt_Opr;
00794                FOLD_OPERATION(
00795                               &tmp_opr, 
00796                               &loc_result.v,
00797                               &res_linear_type,
00798                               &r_value.v,
00799                               &r_linear_type,
00800                               &r_value.v,
00801                               &r_linear_type, 
00802                               &a3_value.v,
00803                               &a3_linear_type);
00804 # else
00805                mask = AR_convert((AR_DATA *)loc_result.v,
00806                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
00807                             (const AR_DATA *)r_value.v,
00808                             (const AR_TYPE *)&linear_to_arith[r_linear_type]);
00809 # endif
00810 
00811                ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
00812                SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
00813 
00814                for (i = 0; i < num_host_wds[res_linear_type]; i++) {
00815                   r_value.v[i] = loc_result.v[i];
00816                }
00817             }
00818 
00819             l_linear_type = Err_Res;
00820 
00821 /* fff            SHIFT_ARITH_ARG(r_value.v, res_linear_type); */
00822 
00823 /* SELECTED_REAL_KIND instrinc function implementation in fold.f
00824  * is removed because Linux doesn't have F90 compiler, use AR_xxx
00825  * implemenation in arith.a instead!
00826  */
00827 # if 0
00828             FOLD_OPERATION(
00829                               &opr, 
00830                               &loc_result.v,
00831                               &res_linear_type,
00832                               &l_value.v,
00833                               &l_linear_type,
00834                               &r_value.v,
00835                               &r_linear_type, 
00836                               &a3_value.v,
00837                               &a3_linear_type);
00838 # else
00839             mask = AR_selected_real_kind((AR_DATA *)loc_result.v,
00840                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
00841                         (const AR_DATA *)NULL,
00842                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
00843                         (const AR_DATA *)r_value.v,
00844                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
00845 # endif
00846          }
00847          else {
00848 
00849             for (i = 0; i < num_host_wds[l_linear_type]; i++) {
00850                l_value.v[i] = ((long_type *)l_value_ptr)[i];
00851             }
00852 
00853             if (l_linear_type != res_linear_type) { 
00854 /* fff               SHIFT_ARITH_ARG(l_value.v, l_linear_type); */
00855 
00856 # if defined(_USE_FOLD_DOT_f)
00857                tmp_opr = Cvrt_Opr;
00858                FOLD_OPERATION(
00859                               &tmp_opr,  
00860                               &loc_result.v,
00861                               &res_linear_type,
00862                               &l_value.v,
00863                               &l_linear_type,
00864                               &r_value.v,
00865                               &r_linear_type, 
00866                               &a3_value.v,
00867                               &a3_linear_type);
00868 # else
00869                mask = AR_convert((AR_DATA *)loc_result.v,
00870                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
00871                             (const AR_DATA *)l_value.v,
00872                             (const AR_TYPE *)&linear_to_arith[l_linear_type]);
00873 # endif
00874 
00875                ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
00876                SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
00877 
00878                for (i = 0; i < num_host_wds[res_linear_type]; i++) {
00879                   l_value.v[i] = loc_result.v[i];
00880                }
00881             }
00882 
00883 /* fff            SHIFT_ARITH_ARG(l_value.v, res_linear_type); */
00884 
00885             for (i = 0; i < num_host_wds[r_linear_type]; i++) {
00886                r_value.v[i] = ((long_type *)r_value_ptr)[i];
00887             }
00888 
00889             if (r_linear_type != res_linear_type) { 
00890 /*               SHIFT_ARITH_ARG(r_value.v, r_linear_type); */
00891 
00892 # if defined(_USE_FOLD_DOT_f)
00893                tmp_opr = Cvrt_Opr;
00894                FOLD_OPERATION(
00895                               &tmp_opr, 
00896                               &loc_result.v,
00897                               &res_linear_type,
00898                               &r_value.v,
00899                               &r_linear_type,
00900                               &r_value.v,
00901                               &r_linear_type, 
00902                               &a3_value.v,
00903                               &a3_linear_type);
00904 # else
00905                mask = AR_convert((AR_DATA *)loc_result.v,
00906                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
00907                             (const AR_DATA *)r_value.v,
00908                             (const AR_TYPE *)&linear_to_arith[r_linear_type]);
00909 # endif
00910 
00911                ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
00912                SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
00913 
00914                for (i = 0; i < num_host_wds[res_linear_type]; i++) {
00915                   r_value.v[i] = loc_result.v[i];
00916                }
00917             }
00918 
00919 /*            SHIFT_ARITH_ARG(r_value.v, res_linear_type); */
00920 
00921 /* SELECTED_REAL_KIND instrinc function implementation in fold.f
00922  * is removed because Linux doesn't have F90 compiler, use AR_xxx
00923  * implemenation in arith.a instead!
00924  */
00925 # if 0
00926             FOLD_OPERATION(
00927                               &opr, 
00928                               &loc_result.v,
00929                               &res_linear_type,
00930                               &l_value.v,
00931                               &l_linear_type,
00932                               &r_value.v,
00933                               &r_linear_type, 
00934                               &a3_value.v,
00935                               &a3_linear_type);
00936 # else
00937             mask = AR_selected_real_kind((AR_DATA *)loc_result.v,
00938                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
00939                         (const AR_DATA *)l_value.v,
00940                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
00941                         (const AR_DATA *)r_value.v,
00942                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
00943 # endif
00944          }
00945 
00946          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
00947          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
00948 
00949          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
00950             result[i] = loc_result.v[i];
00951          }
00952    } 
00953 
00954          break; 
00955 
00956 
00957       case SIK_Opr :
00958          cn_idx = ntr_const_tbl(l_type_idx, FALSE, &l_value.v[0]);
00959 
00960          if (compare_cn_and_value(cn_idx, RANGE_INT1_F90, Le_Opr)) {
00961             i = 1;
00962          }
00963          else if (compare_cn_and_value(cn_idx, RANGE_INT2_F90, Le_Opr)) {
00964             i = 2;
00965          }
00966          else if (compare_cn_and_value(cn_idx, RANGE_INT4_F90, Le_Opr)) {
00967             i = 4;
00968          }
00969          else if (compare_cn_and_value(cn_idx, RANGE_INT8_F90, Le_Opr)) {
00970             i = 8;
00971          }
00972          else {
00973             i = -1;
00974          }
00975 
00976          C_TO_F_INT(result, i, res_linear_type);
00977 
00978          break;
00979 
00980 
00981       case Uminus_Opr :
00982          if (l_linear_type != res_linear_type &&
00983              TYP_TYPE(l_type_idx) != Typeless) {
00984 
00985             SHIFT_ARITH_ARG(l_value.v, l_linear_type);
00986 
00987 # if defined(_USE_FOLD_DOT_f)            
00988             tmp_opr = Cvrt_Opr;
00989             FOLD_OPERATION(
00990                            &tmp_opr,  
00991                            &loc_result.v,
00992                            &res_linear_type,
00993                            &l_value.v,
00994                            &l_linear_type,
00995                            &r_value.v,
00996                            &r_linear_type, 
00997                            &a3_value.v,
00998                            &a3_linear_type);
00999 # else
01000             mask = AR_convert((AR_DATA *)loc_result.v,
01001                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
01002                          (const AR_DATA *)l_value.v,
01003                          (const AR_TYPE *)&linear_to_arith[l_linear_type]);
01004 # endif
01005 
01006             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01007             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01008 
01009             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01010                l_value.v[i] = loc_result.v[i];
01011             }
01012          }
01013 
01014          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
01015 
01016 # if defined(_USE_FOLD_DOT_f)
01017          FOLD_OPERATION(
01018                         &opr,   
01019                         &loc_result.v,
01020                         &res_linear_type,
01021                         &l_value.v,
01022                         &res_linear_type,
01023                         &r_value.v,
01024                         &res_linear_type, 
01025                         &a3_value.v,
01026                         &a3_linear_type);
01027 # else
01028          mask = AR_negate((AR_DATA *)loc_result.v,
01029                       (const AR_TYPE *)&linear_to_arith[res_linear_type],
01030                       (const AR_DATA *)l_value.v,
01031                       (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01032 # endif
01033 
01034          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01035          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01036 
01037          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01038             result[i] = loc_result.v[i];
01039          }
01040          break;
01041 
01042 
01043       case Cvrt_Opr :
01044       case Int_Opr :
01045          if (TYP_TYPE(l_type_idx) == Character) {  /* source */
01046             length_o = CN_INT_TO_C(TYP_IDX(l_type_idx));
01047 
01048             if (TYP_TYPE((*res_type_idx)) == Character) {  /* destination */
01049                length_d = CN_INT_TO_C(TYP_IDX((*res_type_idx)));
01050             }
01051             else {
01052                length_d = num_host_wds[TYP_LINEAR((*res_type_idx))] *
01053                                      TARGET_CHARS_PER_WORD;
01054             }
01055 
01056             char_ptr = (char *) result;
01057             l_value_ptr = (char *) &l_value.v;
01058 
01059             for (i = 0; i < length_o; i++) {
01060                char_ptr[i] = l_value_ptr[i];
01061             }
01062 
01063             for (j = i; j < length_d; j++) {
01064                char_ptr[j] = ' ';
01065             }
01066 
01067             break;
01068          }
01069 
01070          if (TYP_TYPE(l_type_idx) == Logical &&
01071              TYP_TYPE((*res_type_idx)) == Logical) {
01072 
01073 # if defined(_TARGET_OS_SOLARIS) || (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX))
01074             if (l_linear_type == Logical_8 &&
01075                 (res_linear_type == Logical_1 ||
01076                  res_linear_type == Logical_2 ||
01077                  res_linear_type == Logical_4)) {
01078 
01079 # if defined(_HOST_LITTLE_ENDIAN) && defined(_TARGET_LITTLE_ENDIAN)
01080                *(long *)result = *(long long *)(l_value.v);
01081 # else
01082                result[0] = l_value.v[1];
01083 # endif
01084             }
01085             else if (res_linear_type == Logical_8 &&
01086                      (l_linear_type == Logical_1 ||
01087                       l_linear_type == Logical_2 ||
01088                       l_linear_type == Logical_4)) {
01089 
01090 # if defined(_HOST_LITTLE_ENDIAN) && defined(_TARGET_LITTLE_ENDIAN)
01091                *(long long *)result = *(long *)(l_value.v);
01092 # else
01093                result[0] = 0;
01094                result[1] = l_value.v[0];
01095 # endif
01096             }
01097             else {
01098                result[0] = l_value.v[0];
01099                result[1] = l_value.v[1];
01100             }
01101 # else
01102             result[0] = l_value.v[0];
01103 # endif
01104             break;
01105          }
01106 
01107          if (TYP_TYPE(l_type_idx) == Typeless) {   /* source */
01108             for (i = 0;i < (TYP_BIT_LEN(l_type_idx)/TARGET_BITS_PER_WORD);i++) {
01109                result[i] = l_value.v[i];
01110             }
01111             break;
01112          }
01113 
01114          if (l_linear_type == res_linear_type) {
01115             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01116                result[i] = l_value.v[i];
01117             }
01118             break;
01119          }
01120 
01121 # if defined(_USE_FOLD_DOT_f)
01122          tmp_opr = Cvrt_Opr;
01123          FOLD_OPERATION(
01124                         &tmp_opr,  
01125                         &loc_result.v,
01126                         &res_linear_type,
01127                         &l_value.v,
01128                         &l_linear_type,
01129                         &r_value.v,
01130                         &r_linear_type, 
01131                         &a3_value.v,
01132                         &a3_linear_type);
01133 # else 
01134          arith_type = linear_to_arith[l_linear_type];
01135 
01136          if ((TYP_TYPE(l_type_idx) == Real ||
01137               TYP_TYPE(l_type_idx) == Complex) &&
01138               TYP_TYPE((*res_type_idx)) == Integer) {
01139 
01140             /* this needs to be truncation, not rounding */
01141 
01142             switch(linear_to_arith[l_linear_type]) {
01143                case AR_Float_IEEE_NR_32 :
01144                   arith_type = AR_Float_IEEE_ZE_32;
01145                   break;
01146 
01147                case AR_Float_IEEE_NR_64 :
01148                   arith_type = AR_Float_IEEE_ZE_64;
01149                   break;
01150 
01151                case AR_Float_IEEE_NR_128 :
01152                   arith_type = AR_Float_IEEE_ZE_128;
01153                   break;
01154 
01155                case AR_Complex_IEEE_NR_32 :
01156                   arith_type = AR_Complex_IEEE_ZE_32;
01157                   break;
01158 
01159                case AR_Complex_IEEE_NR_64 :
01160                   arith_type = AR_Complex_IEEE_ZE_64;
01161                   break;
01162 
01163                case AR_Complex_IEEE_NR_128 :
01164                   arith_type = AR_Complex_IEEE_ZE_128;
01165                   break;
01166 
01167             }
01168          }
01169 
01170          SHIFT_ARITH_ARG(l_value.v, l_linear_type);
01171 
01172          mask = AR_convert((AR_DATA *)loc_result.v,
01173                       (const AR_TYPE *)&linear_to_arith[res_linear_type],
01174                       (const AR_DATA *)l_value.v,
01175                       (const AR_TYPE *)&arith_type);
01176 # endif
01177 
01178          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01179          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01180 
01181          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01182             result[i] = loc_result.v[i];
01183          }
01184          break;
01185 
01186 
01187       case Cvrt_Unsigned_Opr :
01188          SHIFT_ARITH_ARG(l_value.v, l_linear_type);
01189 
01190          arith_type = linear_to_arith[res_linear_type];
01191          arith_type_l = linear_to_arith[l_linear_type];
01192 
01193 # if defined(_TARGET_OS_MAX) || defined(_TARGET_OS_SOLARIS) ||  \
01194      (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX))
01195 
01196          if (TYP_TYPE((*res_type_idx)) == Integer) {
01197             arith_type = input_arith_type[res_linear_type];
01198          }
01199 
01200          if (arith_type_l == AR_Int_32_S) {
01201             arith_type_l = AR_Int_32_U;
01202          }
01203          else if (arith_type_l == AR_Int_64_S) {
01204             arith_type_l = AR_Int_64_U;
01205          }
01206 # endif
01207 
01208 # if defined(_USE_FOLD_DOT_f)
01209          tmp_opr = Cvrt_Opr;
01210          FOLD_OPERATION(
01211                         &tmp_opr,   
01212                         &loc_result.v,
01213                         &res_linear_type,
01214                         &l_value.v,
01215                         &l_linear_type,
01216                         &r_value.v,
01217                         &r_linear_type, 
01218                         &a3_value.v,
01219                         &a3_linear_type);
01220 # else
01221          mask = AR_convert((AR_DATA *)loc_result.v,
01222                       (const AR_TYPE *)&arith_type,
01223                       (const AR_DATA *)l_value.v,
01224                       (const AR_TYPE *)&arith_type_l);
01225 # endif
01226 
01227          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01228          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01229 
01230          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01231             result[i] = loc_result.v[i];
01232          }
01233          break;
01234 
01235 
01236       case Power_Opr :
01237          if (l_linear_type != res_linear_type &&
01238              TYP_TYPE(l_type_idx) != Typeless) {
01239 
01240             SHIFT_ARITH_ARG(l_value.v, l_linear_type);
01241 
01242 # if defined(_USE_FOLD_DOT_f)
01243             tmp_opr = Cvrt_Opr;
01244             FOLD_OPERATION(
01245                            &tmp_opr, 
01246                            &loc_result.v,
01247                            &res_linear_type,
01248                            &l_value.v,
01249                            &l_linear_type,
01250                            &r_value.v,
01251                            &r_linear_type, 
01252                            &a3_value.v,
01253                            &a3_linear_type);
01254 # else
01255             mask = AR_convert((AR_DATA *)loc_result.v,
01256                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
01257                          (const AR_DATA *)l_value.v,
01258                          (const AR_TYPE *)&linear_to_arith[l_linear_type]);
01259 # endif
01260             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01261             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01262 
01263             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01264                l_value.v[i] = loc_result.v[i];
01265             }
01266          }
01267 
01268          if (r_linear_type != res_linear_type &&
01269              TYP_TYPE(r_type_idx) == Integer &&
01270              TYP_TYPE((*res_type_idx)) == Integer) {
01271 
01272             SHIFT_ARITH_ARG(r_value.v, r_linear_type);
01273 
01274 # if defined(_USE_FOLD_DOT_f)
01275             tmp_opr = Cvrt_Opr;
01276             FOLD_OPERATION(
01277                            &tmp_opr,   
01278                            &loc_result.v,
01279                            &res_linear_type,
01280                            &r_value.v,
01281                            &r_linear_type,
01282                            &r_value.v,
01283                            &r_linear_type, 
01284                            &a3_value.v,
01285                            &a3_linear_type);
01286 # else
01287             mask = AR_convert((AR_DATA *)loc_result.v,
01288                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
01289                             (const AR_DATA *)r_value.v,
01290                             (const AR_TYPE *)&linear_to_arith[r_linear_type]);
01291 # endif
01292 
01293             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01294             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01295 
01296             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01297                r_value.v[i] = loc_result.v[i];
01298             }
01299 
01300             r_linear_type = res_linear_type;
01301          }
01302          else if (r_linear_type != res_linear_type &&
01303                   TYP_TYPE(r_type_idx) != Integer &&
01304                   TYP_TYPE(r_type_idx) != Typeless) {
01305 
01306             SHIFT_ARITH_ARG(r_value.v, r_linear_type);
01307 
01308 # if defined(_USE_FOLD_DOT_f)
01309             tmp_opr = Cvrt_Opr;
01310             FOLD_OPERATION(
01311                            &tmp_opr,  
01312                            &loc_result.v,
01313                            &res_linear_type,
01314                            &r_value.v,
01315                            &r_linear_type,
01316                            &r_value.v,
01317                            &r_linear_type, 
01318                            &a3_value.v,
01319                            &a3_linear_type);
01320 # else
01321             mask = AR_convert((AR_DATA *)loc_result.v,
01322                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
01323                             (const AR_DATA *)r_value.v,
01324                             (const AR_TYPE *)&linear_to_arith[r_linear_type]);
01325 # endif
01326 
01327             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01328             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01329 
01330             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01331                r_value.v[i] = loc_result.v[i];
01332             }
01333 
01334             r_linear_type = res_linear_type;
01335          }
01336 
01337          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
01338          SHIFT_ARITH_ARG(r_value.v, r_linear_type);
01339 
01340 # if defined(_USE_FOLD_DOT_f)
01341          FOLD_OPERATION(
01342                         &opr,   
01343                         &loc_result.v,
01344                         &res_linear_type,
01345                         &l_value.v,
01346                         &res_linear_type,
01347                         &r_value.v,
01348                         &r_linear_type, 
01349                         &a3_value.v,
01350                         &a3_linear_type);
01351 # else
01352          mask = AR_power((AR_DATA *)loc_result.v,
01353                      (const AR_TYPE *)&linear_to_arith[res_linear_type],
01354                      (const AR_DATA *)l_value.v,
01355                      (const AR_TYPE *)&linear_to_arith[res_linear_type],
01356                      (const AR_DATA *)r_value.v,
01357                      (const AR_TYPE *)&linear_to_arith[r_linear_type]);
01358 # endif
01359 
01360          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01361          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01362 
01363          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01364             result[i] = loc_result.v[i];
01365          }
01366          break;
01367 
01368 
01369       case Mult_Opr :
01370       case Div_Opr  :
01371       case Real_Div_To_Int_Opr:
01372       case Minus_Opr :
01373       case Plus_Opr :
01374       case Mod_Opr :
01375       case Modulo_Opr :
01376          if (l_linear_type != res_linear_type &&
01377              TYP_TYPE(l_type_idx) != Typeless) {
01378 
01379             SHIFT_ARITH_ARG(l_value.v, l_linear_type);
01380 
01381 # if defined(_USE_FOLD_DOT_f)            
01382             tmp_opr = Cvrt_Opr;
01383             FOLD_OPERATION(
01384                            &tmp_opr,  
01385                            &loc_result.v,
01386                            &res_linear_type,
01387                            &l_value.v,
01388                            &l_linear_type,
01389                            &r_value.v,
01390                            &r_linear_type, 
01391                            &a3_value.v,
01392                            &a3_linear_type);
01393 # else 
01394             mask = AR_convert((AR_DATA *)loc_result.v,
01395                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
01396                          (const AR_DATA *)l_value.v,
01397                          (const AR_TYPE *)&linear_to_arith[l_linear_type]);
01398 # endif
01399 
01400             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01401             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01402 
01403             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01404                l_value.v[i] = loc_result.v[i];
01405             }
01406          }
01407 
01408          if (r_linear_type != res_linear_type &&
01409              TYP_TYPE(r_type_idx) != Typeless) {
01410 
01411             SHIFT_ARITH_ARG(r_value.v, r_linear_type);
01412 
01413 # if defined(_USE_FOLD_DOT_f)            
01414             tmp_opr = Cvrt_Opr;
01415             FOLD_OPERATION(
01416                            &tmp_opr,  
01417                            &loc_result.v,
01418                            &res_linear_type,
01419                            &r_value.v,
01420                            &r_linear_type,
01421                            &r_value.v,
01422                            &r_linear_type, 
01423                            &a3_value.v,
01424                            &a3_linear_type);
01425 # else 
01426              mask = AR_convert((AR_DATA *)loc_result.v,
01427                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
01428                             (const AR_DATA *)r_value.v,
01429                             (const AR_TYPE *)&linear_to_arith[r_linear_type]);
01430 # endif
01431 
01432             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01433             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01434 
01435             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01436                r_value.v[i] = loc_result.v[i];
01437             }
01438          }
01439 
01440          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
01441          SHIFT_ARITH_ARG(r_value.v, res_linear_type);
01442 
01443 # if defined(_USE_FOLD_DOT_f)            
01444          FOLD_OPERATION(
01445                         &opr,  
01446                         &loc_result.v,
01447                         &res_linear_type,
01448                         &l_value.v,
01449                         &res_linear_type,
01450                         &r_value.v,
01451                         &res_linear_type, 
01452                         &a3_value.v,
01453                         &a3_linear_type);
01454 # else 
01455          switch (opr) {
01456          case Mult_Opr:
01457             mask = AR_multiply((AR_DATA *)loc_result.v,
01458                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01459                         (const AR_DATA *)l_value.v,
01460                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01461                         (const AR_DATA *)r_value.v,
01462                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01463             break;
01464 
01465          case Div_Opr  :
01466             mask = AR_divide((AR_DATA *)loc_result.v,
01467                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01468                         (const AR_DATA *)l_value.v,
01469                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01470                         (const AR_DATA *)r_value.v,
01471                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01472             break;
01473 
01474          case Real_Div_To_Int_Opr  :
01475             mask = AR_divide((AR_DATA *)loc_result.v,
01476                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01477                         (const AR_DATA *)l_value.v,
01478                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01479                         (const AR_DATA *)r_value.v,
01480                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01481 
01482             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01483 
01484             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01485                r_value.v[i] = loc_result.v[i];
01486             }
01487 
01488             mask = AR_round_int_div((AR_DATA *)loc_result.v,
01489                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01490                         (const AR_DATA *)r_value.v,
01491                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01492             break;
01493 
01494          case Minus_Opr :
01495             mask = AR_subtract((AR_DATA *)loc_result.v,
01496                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01497                         (const AR_DATA *)l_value.v,
01498                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01499                         (const AR_DATA *)r_value.v,
01500                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01501             break;
01502 
01503          case Plus_Opr :
01504             mask = AR_add((AR_DATA *)loc_result.v,
01505                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01506                         (const AR_DATA *)l_value.v,
01507                         (const AR_TYPE *)&linear_to_arith[res_linear_type],
01508                         (const AR_DATA *)r_value.v,
01509                         (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01510             break;
01511 
01512          case Modulo_Opr :
01513             mask = AR_Modulo((AR_DATA *)loc_result.v,
01514                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
01515                           (const AR_DATA *)l_value.v,
01516                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
01517                           (const AR_DATA *)r_value.v,
01518                           (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01519             break;
01520 
01521          case Mod_Opr :
01522             mask = AR_mod((AR_DATA *)loc_result.v,
01523                      (const AR_TYPE *)&linear_to_arith[res_linear_type],
01524                      (const AR_DATA *)l_value.v,
01525                      (const AR_TYPE *)&linear_to_arith[res_linear_type],
01526                      (const AR_DATA *)r_value.v,
01527                      (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01528             break;
01529 
01530          }
01531 # endif
01532 
01533          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01534          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01535 
01536          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01537             result[i] = loc_result.v[i];
01538          }
01539          break;
01540 
01541 
01542       case Eq_Opr :
01543       case Ne_Opr :
01544       case Lt_Opr :
01545       case Le_Opr :
01546       case Gt_Opr :
01547       case Ge_Opr :
01548          if (TYP_TYPE(l_type_idx) == Character &&
01549              TYP_TYPE(r_type_idx) == Character) {
01550             f90_character_compare(l_value_ptr, 
01551                                   CN_INT_TO_C(TYP_IDX(l_type_idx)),
01552                                   r_value_ptr,
01553                                   CN_INT_TO_C(TYP_IDX(r_type_idx)),
01554                                   opr,
01555                                   result,
01556                                   (*res_type_idx));
01557          }
01558          else {
01559             res_linear_type = (linear_type_type)
01560                               bin_add_tbl[l_linear_type][r_linear_type].type;
01561 
01562             if (l_linear_type != res_linear_type &&
01563                 TYP_TYPE(l_type_idx) != Typeless) {
01564 
01565                SHIFT_ARITH_ARG(l_value.v, l_linear_type);
01566 
01567 # if defined(_USE_FOLD_DOT_f)
01568                tmp_opr = Cvrt_Opr;
01569                FOLD_OPERATION(
01570                               &tmp_opr,  
01571                               &loc_result.v,
01572                               &res_linear_type,
01573                               &l_value.v,
01574                               &l_linear_type,
01575                               &r_value.v,
01576                               &r_linear_type, 
01577                               &a3_value.v,
01578                               &a3_linear_type);
01579 # else
01580                 mask = AR_convert((AR_DATA *)loc_result.v,
01581                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
01582                             (const AR_DATA *)l_value.v,
01583                             (const AR_TYPE *)&linear_to_arith[l_linear_type]);
01584 # endif
01585 
01586                ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01587                SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01588 
01589                for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01590                   l_value.v[i] = loc_result.v[i];
01591                }
01592             }
01593 
01594             if (r_linear_type != res_linear_type &&
01595                 TYP_TYPE(r_type_idx) != Typeless) {
01596 
01597                SHIFT_ARITH_ARG(r_value.v, r_linear_type);
01598    
01599 # if defined(_USE_FOLD_DOT_f)
01600                tmp_opr = Cvrt_Opr;
01601                FOLD_OPERATION(
01602                               &tmp_opr,  
01603                               &loc_result.v,
01604                               &res_linear_type,
01605                               &r_value.v,
01606                               &r_linear_type,
01607                               &r_value.v,
01608                               &r_linear_type, 
01609                               &a3_value.v,
01610                               &a3_linear_type);
01611 # else
01612                mask = AR_convert((AR_DATA *)loc_result.v,
01613                            (const AR_TYPE *)&linear_to_arith[res_linear_type],
01614                            (const AR_DATA *)r_value.v,
01615                            (const AR_TYPE *)&linear_to_arith[r_linear_type]);
01616 # endif
01617 
01618                ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01619                SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01620 
01621                for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01622                   r_value.v[i] = loc_result.v[i];
01623                }
01624             }
01625 
01626 # if defined(_USE_FOLD_DOT_f)
01627             FOLD_OPERATION(
01628                            &opr,  
01629                            &loc_result.v,
01630                            &res_linear_type,
01631                            &l_value.v,
01632                            &res_linear_type,
01633                            &r_value.v,
01634                            &res_linear_type, 
01635                            &a3_value.v,
01636                            &a3_linear_type);
01637 
01638             if (loc_result.v[0] == 0) {
01639                set_up_logical_constant(result, 
01640                                        (*res_type_idx), 
01641                                        FALSE_VALUE, 
01642                                        FALSE);
01643             }
01644             else {
01645                set_up_logical_constant(result, 
01646                                        (*res_type_idx), 
01647                                        TRUE_VALUE, 
01648                                        FALSE);
01649             }
01650 # else
01651             SHIFT_ARITH_ARG(l_value.v, res_linear_type);
01652             SHIFT_ARITH_ARG(r_value.v, res_linear_type);
01653 
01654             comp_res = AR_compare((const AR_DATA *)l_value.v,
01655                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
01656                           (const AR_DATA *)r_value.v,
01657                           (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01658 
01659             switch (opr) {
01660             case Eq_Opr :
01661                if (comp_res == AR_Compare_EQ) {
01662                   set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE, 
01663                                           FALSE);
01664                }
01665                else {
01666                   set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE, 
01667                                           FALSE);
01668                }
01669                break;
01670 
01671             case Ne_Opr :
01672                if (comp_res != AR_Compare_EQ) {
01673                   set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE,
01674                                           FALSE);
01675                }
01676                else {
01677                   set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,
01678                                           FALSE);
01679                }
01680                break;
01681 
01682             case Lt_Opr :
01683                if (comp_res == AR_Compare_LT) {
01684                   set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE,
01685                                           FALSE);
01686                }
01687                else {
01688                   set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,
01689                                           FALSE);
01690                }
01691                break;
01692 
01693             case Le_Opr :
01694                if (comp_res != AR_Compare_GT) {
01695                   set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE,
01696                                           FALSE);
01697                }
01698                else {
01699                   set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,
01700                                           FALSE);
01701                }
01702                break;
01703 
01704             case Gt_Opr :
01705                if (comp_res == AR_Compare_GT) {
01706                   set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE,
01707                                           FALSE);
01708                }
01709                else {
01710                   set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,
01711                                           FALSE);
01712                }
01713                break;
01714 
01715             case Ge_Opr :
01716                if (comp_res != AR_Compare_LT) {
01717                   set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE,
01718                                           FALSE);
01719                }
01720                else {
01721                   set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,
01722                                           FALSE);
01723                }
01724                break;
01725             }
01726 # endif
01727 
01728             res_linear_type = TYP_LINEAR(*res_type_idx);
01729          }
01730          break;
01731 
01732 
01733       case Not_Opr :
01734          if (THIS_IS_TRUE(l_value.v, l_type_idx)) {
01735             set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,FALSE);
01736          }
01737          else {
01738             set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE, FALSE);
01739          }
01740          break;
01741 
01742 
01743       case And_Opr  :
01744          if (THIS_IS_TRUE(l_value.v, l_type_idx) &&
01745              THIS_IS_TRUE(r_value.v, r_type_idx)) {
01746             set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE, FALSE);
01747          }
01748          else {
01749             set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,FALSE);
01750          }
01751          break;
01752 
01753 
01754       case Or_Opr   :
01755          if (THIS_IS_TRUE(l_value.v, l_type_idx) ||
01756              THIS_IS_TRUE(r_value.v, r_type_idx)) {
01757             set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE, FALSE);
01758          }
01759          else {
01760             set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,FALSE);
01761          }
01762          break;
01763 
01764 
01765       case Eqv_Opr  :
01766          if ((THIS_IS_TRUE(l_value.v, l_type_idx)) == 
01767                  (THIS_IS_TRUE(r_value.v, r_type_idx))) {
01768             set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE, FALSE);
01769          }
01770          else {
01771             set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,FALSE);
01772          }
01773          break;
01774 
01775 
01776       case Neqv_Opr :
01777          if ((THIS_IS_TRUE(l_value.v, l_type_idx)) != 
01778                  (THIS_IS_TRUE(r_value.v, r_type_idx))) {
01779             set_up_logical_constant(result, (*res_type_idx), TRUE_VALUE, FALSE);
01780          }
01781          else {
01782             set_up_logical_constant(result, (*res_type_idx), FALSE_VALUE,FALSE);
01783          }
01784          break;
01785 
01786 
01787       case Bnot_Opr :
01788          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01789             result[i] = ~l_value.v[i];
01790          }
01791          break;
01792 
01793 
01794       case Band_Opr  :
01795          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01796             result[i] = l_value.v[i] & r_value.v[i];
01797          }
01798          break;
01799 
01800 
01801       case Bor_Opr   :
01802          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01803             result[i] = l_value.v[i] | r_value.v[i];
01804          }
01805          break;
01806 
01807 
01808       case Bneqv_Opr :
01809          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01810             result[i] = l_value.v[i] ^ r_value.v[i];
01811          }
01812          break;
01813 
01814 
01815       case Beqv_Opr :
01816          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01817             result[i] = ~(l_value.v[i] ^ r_value.v[i]);
01818          }
01819          break;
01820 
01821 
01822 # if defined(_USE_FOLD_DOT_f)
01823       case Sqrt_Opr :
01824          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
01825 
01826          FOLD_OPERATION(
01827                         &opr, 
01828                         &loc_result.v,
01829                         &res_linear_type,
01830                         &l_value.v,
01831                         &res_linear_type,
01832                         &r_value.v,
01833                         &res_linear_type, 
01834                         &a3_value.v,
01835                         &a3_linear_type);
01836 
01837          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01838          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01839 
01840          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01841             result[i] = loc_result.v[i];
01842          }
01843          break;
01844 # endif
01845 
01846 
01847       case Abs_Opr :
01848          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
01849 
01850 # if defined(_USE_FOLD_DOT_f)
01851          FOLD_OPERATION(
01852                         &opr, 
01853                         &loc_result.v,
01854                         &res_linear_type,
01855                         &l_value.v,
01856                         &res_linear_type,
01857                         &r_value.v,
01858                         &res_linear_type, 
01859                         &a3_value.v,
01860                         &a3_linear_type);
01861 # else
01862          mask = AR_abs((AR_DATA *)loc_result.v,
01863                       (const AR_TYPE *)&linear_to_arith[res_linear_type],
01864                       (const AR_DATA *)l_value.v,
01865                       (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01866 # endif
01867 
01868          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01869          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
01870 
01871          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01872             result[i] = loc_result.v[i];
01873          }
01874          break;
01875 
01876 
01877       case Nint_Opr :
01878 # if defined(_USE_FOLD_DOT_f)
01879          FOLD_OPERATION(
01880                         &opr, 
01881                         &loc_result.v,
01882                         &res_linear_type,
01883                         &l_value.v,
01884                         &l_linear_type,
01885                         &r_value.v,
01886                         &r_linear_type, 
01887                         &a3_value.v,
01888                         &a3_linear_type);
01889 
01890          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
01891             result[i] = loc_result.v[i];
01892          }
01893 # else 
01894          strcpy(char_buf, "0.5");
01895          mask = AR_convert_str_to_float((AR_DATA *)a3_value.v,
01896                           (const AR_TYPE *)&input_arith_type[l_linear_type],
01897                           (const char *)char_buf);
01898          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01899          SHIFT_ARITH_RESULT(a3_value.v, l_linear_type);
01900 
01901          type_idx = CG_LOGICAL_DEFAULT_TYPE;
01902 
01903          ok &= folder_driver((char *)l_value.v,
01904                            l_type_idx,
01905                            (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
01906                            CG_INTEGER_DEFAULT_TYPE,
01907                            a4_value.v,
01908                            &type_idx,
01909                            line,
01910                            col,
01911                            2,
01912                            Le_Opr);
01913 
01914          if (THIS_IS_TRUE(a4_value.v,type_idx)) {
01915             type_idx = l_type_idx;
01916             ok &= folder_driver((char *)l_value.v,
01917                                l_type_idx,
01918                                (char *)a3_value.v,
01919                                l_type_idx,
01920                                a4_value.v,
01921                                &type_idx,
01922                                line,
01923                                col,
01924                                2,
01925                                Minus_Opr);
01926          }
01927          else {
01928             type_idx = l_type_idx;
01929             ok &= folder_driver((char *)l_value.v,
01930                                l_type_idx,
01931                                (char *)a3_value.v,
01932                                l_type_idx,
01933                                a4_value.v,
01934                                &type_idx,
01935                                line,
01936                                col,
01937                                2,
01938                                Plus_Opr);
01939          }
01940 
01941          ok &= folder_driver((char *)a4_value.v,
01942                              l_type_idx,
01943                              NULL,
01944                              NULL_IDX,
01945                              result,
01946                              res_type_idx,
01947                              line,
01948                              col,
01949                              1,
01950                              Int_Opr);
01951 # endif
01952          break;
01953 
01954 
01955       case Sign_Opr :
01956          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
01957 
01958 # if defined(_USE_FOLD_DOT_f)
01959          tmp_opr = Abs_Opr;
01960          FOLD_OPERATION(
01961                         &tmp_opr,   
01962                         &a3_value.v,
01963                         &res_linear_type,
01964                         &l_value.v,
01965                         &res_linear_type,
01966                         &r_value.v,
01967                         &r_linear_type, 
01968                         &a3_value.v,
01969                         &a3_linear_type);
01970 # else
01971          mask = AR_abs((AR_DATA *)a3_value.v,
01972                       (const AR_TYPE *)&linear_to_arith[res_linear_type],
01973                       (const AR_DATA *)l_value.v,
01974                       (const AR_TYPE *)&linear_to_arith[res_linear_type]);
01975 # endif
01976 
01977          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
01978          SHIFT_ARITH_RESULT(a3_value.v, res_linear_type);
01979 
01980          type_idx = CG_LOGICAL_DEFAULT_TYPE;
01981 
01982          ok &= folder_driver((char *)r_value.v,
01983                            r_type_idx,
01984                            (char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
01985                            CG_INTEGER_DEFAULT_TYPE,
01986                            a4_value.v,
01987                            &type_idx,
01988                            line,
01989                            col,
01990                            2,
01991                            Lt_Opr);
01992 
01993          if (THIS_IS_TRUE(a4_value.v, type_idx)) {
01994             /* negate the result */
01995             SHIFT_ARITH_ARG(a3_value.v, res_linear_type);
01996 
01997 # if defined(_USE_FOLD_DOT_f)
01998             tmp_opr = Uminus_Opr;
01999             FOLD_OPERATION(
02000                            &tmp_opr,  
02001                            &loc_result.v,
02002                            &res_linear_type,
02003                            &a3_value.v,
02004                            &res_linear_type,
02005                            &r_value.v,
02006                            &r_linear_type, 
02007                            &a3_value.v,
02008                            &a3_linear_type);
02009 # else
02010             mask = AR_negate((AR_DATA *)loc_result.v,
02011                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02012                          (const AR_DATA *)a3_value.v,
02013                          (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02014 # endif
02015    
02016             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02017             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02018 
02019             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02020                result[i] = loc_result.v[i];
02021             }
02022          }
02023          else {
02024             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02025                result[i] = a3_value.v[i];
02026             }
02027          }
02028          break;
02029 
02030 
02031 
02032 
02033       case Shift_Opr :
02034          /* to behave like the runtime shift, we must calculate */
02035          /* mod(r_value.v, TARGET_BITS_PER_WORD) to use as shift count */
02036 
02037 # if defined(_USE_FOLD_DOT_f)
02038          FOLD_OPERATION(
02039                         &opr,  
02040                         &loc_result.v,
02041                         &res_linear_type,
02042                         &l_value.v,
02043                         &l_linear_type,
02044                         &r_value.v,
02045                         &r_linear_type, 
02046                         &a3_value.v,
02047                         &a3_linear_type);
02048 
02049          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02050             result[i] = loc_result.v[i];
02051          }
02052 
02053          break;
02054 # endif
02055 
02056 
02057 
02058          a4_value.v[0] = TARGET_BITS_PER_WORD;
02059 # ifdef _TARGET32
02060          if (num_host_wds[res_linear_type] != 1) {
02061             a4_value.v[1] = 2 * TARGET_BITS_PER_WORD;
02062             a4_value.v[0] = 0;
02063          }
02064 # endif
02065 
02066 
02067          SHIFT_ARITH_ARG(r_value.v, res_linear_type);
02068          SHIFT_ARITH_ARG(a4_value.v, res_linear_type);
02069 
02070          mask = AR_mod((AR_DATA *)a3_value.v,
02071                      (const AR_TYPE *)&linear_to_arith[res_linear_type],
02072                      (const AR_DATA *)r_value.v,
02073                      (const AR_TYPE *)&linear_to_arith[res_linear_type],
02074                      (const AR_DATA *)a4_value.v,
02075                      (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02076 
02077          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02078 
02079          a4_value.v[0] = 0;
02080          a4_value.v[1] = 0;
02081          a4_value.v[2] = 0;
02082          a4_value.v[3] = 0;
02083 
02084          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
02085 
02086          if ((mask & AR_STAT_NEGATIVE) != 0) {
02087 
02088             mask = AR_negate((AR_DATA *)loc_result.v,
02089                       (const AR_TYPE *)&linear_to_arith[res_linear_type],
02090                       (const AR_DATA *)a3_value.v,
02091                       (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02092 
02093             for (i = 0; i < 4; i++) {
02094                a3_value.v[i] = loc_result.v[i];
02095             }
02096 
02097             mask = AR_dshiftr((AR_DATA *)r_value.v,
02098                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02099                           (const AR_DATA *)l_value.v,
02100                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02101                           (const AR_DATA *)a4_value.v,
02102                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02103                           (const AR_DATA *)a3_value.v,
02104                           (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02105 
02106             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02107 
02108             mask = AR_shiftr((AR_DATA *)loc_result.v,
02109                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02110                           (const AR_DATA *)l_value.v,
02111                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02112                           (const AR_DATA *)a3_value.v,
02113                           (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02114 
02115             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02116          }
02117          else {
02118             mask = AR_dshiftl((AR_DATA *)r_value.v,
02119                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02120                           (const AR_DATA *)a4_value.v,
02121                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02122                           (const AR_DATA *)l_value.v,
02123                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02124                           (const AR_DATA *)a3_value.v,
02125                           (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02126 
02127             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02128 
02129             mask = AR_shiftl((AR_DATA *)loc_result.v,
02130                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02131                           (const AR_DATA *)l_value.v,
02132                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02133                           (const AR_DATA *)a3_value.v,
02134                           (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02135 
02136             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02137          }
02138 
02139          SHIFT_ARITH_RESULT(r_value.v, res_linear_type);
02140          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02141          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02142             loc_result.v[i] |= r_value.v[i];
02143          }
02144 
02145          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02146             result[i] = loc_result.v[i];
02147          }
02148          break;
02149 
02150 
02151 
02152       case Ishftc_Opr :
02153       case Ibits_Opr :
02154          if (l_linear_type != res_linear_type &&
02155              TYP_TYPE(l_type_idx) != Typeless) {
02156 
02157             SHIFT_ARITH_ARG(l_value.v, l_linear_type);
02158 
02159 # if defined(_USE_FOLD_DOT_f)
02160             tmp_opr = Cvrt_Opr;
02161             FOLD_OPERATION(
02162                            &tmp_opr,  
02163                            &loc_result.v,
02164                            &res_linear_type,
02165                            &l_value.v,
02166                            &l_linear_type,
02167                            &r_value.v,
02168                            &r_linear_type, 
02169                            &a3_value.v,
02170                            &a3_linear_type);
02171 # else
02172             mask = AR_convert((AR_DATA *)loc_result.v,
02173                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02174                          (const AR_DATA *)l_value.v,
02175                          (const AR_TYPE *)&linear_to_arith[l_linear_type]);
02176 # endif
02177 
02178             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02179             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02180 
02181             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02182                l_value.v[i] = loc_result.v[i];
02183             }
02184          }
02185 
02186          if (r_linear_type != res_linear_type &&
02187              TYP_TYPE(r_type_idx) != Typeless) {
02188 
02189             SHIFT_ARITH_ARG(r_value.v, r_linear_type);
02190 
02191 # if defined(_USE_FOLD_DOT_f)
02192             tmp_opr = Cvrt_Opr;
02193             FOLD_OPERATION(
02194                            &tmp_opr,  
02195                            &loc_result.v,
02196                            &res_linear_type,
02197                            &r_value.v,
02198                            &r_linear_type,
02199                            &r_value.v,
02200                            &r_linear_type, 
02201                            &a3_value.v,
02202                            &a3_linear_type);
02203 # else
02204              mask = AR_convert((AR_DATA *)loc_result.v,
02205                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
02206                             (const AR_DATA *)r_value.v,
02207                             (const AR_TYPE *)&linear_to_arith[r_linear_type]);
02208 # endif
02209 
02210             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02211             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02212 
02213             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02214                r_value.v[i] = loc_result.v[i];
02215             }
02216          }
02217 
02218          if (a3_linear_type != res_linear_type &&
02219              TYP_TYPE(a3_type_idx) != Typeless) {
02220 
02221             SHIFT_ARITH_ARG(a3_value.v, a3_linear_type);
02222 
02223 # if defined(_USE_FOLD_DOT_f)
02224             tmp_opr = Cvrt_Opr;
02225             FOLD_OPERATION(
02226                            &tmp_opr,  
02227                            &loc_result.v,
02228                            &res_linear_type,
02229                            &a3_value.v,
02230                            &a3_linear_type,
02231                            &r_value.v,
02232                            &r_linear_type, 
02233                            &a3_value.v,
02234                            &a3_linear_type);
02235 # else
02236              mask = AR_convert((AR_DATA *)loc_result.v,
02237                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
02238                             (const AR_DATA *)a3_value.v,
02239                             (const AR_TYPE *)&linear_to_arith[a3_linear_type]);
02240 # endif
02241 
02242             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02243             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02244 
02245             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02246                a3_value.v[i] = loc_result.v[i];
02247             }
02248          }
02249 
02250          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
02251          SHIFT_ARITH_ARG(r_value.v, res_linear_type);
02252          SHIFT_ARITH_ARG(a3_value.v, res_linear_type);
02253 
02254 # if defined(_USE_FOLD_DOT_f)
02255          FOLD_OPERATION(
02256                           &opr,  
02257                           &loc_result.v,
02258                           &res_linear_type,
02259                           &l_value.v,
02260                           &res_linear_type,
02261                           &r_value.v,
02262                           &res_linear_type, 
02263                           &a3_value.v,
02264                           &res_linear_type);
02265 # else
02266          if (opr == Ibits_Opr) {
02267             mask = AR_ibits((AR_DATA *)loc_result.v,
02268                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02269                           (const AR_DATA *)l_value.v,
02270                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02271                           (const AR_DATA *)r_value.v,
02272                           (const AR_TYPE *)&linear_to_arith[res_linear_type], 
02273                           (const AR_DATA *)a3_value.v,
02274                           (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02275          }
02276          else {
02277             mask = AR_ishftc((AR_DATA *)loc_result.v,
02278                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02279                           (const AR_DATA *)l_value.v,
02280                           (const AR_TYPE *)&linear_to_arith[res_linear_type],
02281                           (const AR_DATA *)r_value.v,
02282                           (const AR_TYPE *)&linear_to_arith[res_linear_type], 
02283                           (const AR_DATA *)a3_value.v,
02284                           (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02285          }
02286 
02287          /* don't check for anything but invalid type here */
02288 
02289          if ((mask & AR_STAT_INVALID_TYPE) != 0) {
02290              PRINTMSG(line, 1079, Internal, col);
02291          }
02292 # endif
02293 
02294          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02295 
02296          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02297             result[i] = loc_result.v[i];
02298          }
02299          break;
02300 
02301 
02302       case Shiftl_Opr :
02303       case Shiftr_Opr :
02304       case Shifta_Opr :
02305          if (l_linear_type != res_linear_type &&
02306              TYP_TYPE(l_type_idx) != Typeless) {
02307 
02308             SHIFT_ARITH_ARG(l_value.v, l_linear_type);
02309 
02310 # if defined(_USE_FOLD_DOT_f)
02311             tmp_opr = Cvrt_Opr;
02312             FOLD_OPERATION(
02313                            &tmp_opr,  
02314                            &loc_result.v,
02315                            &res_linear_type,
02316                            &l_value.v,
02317                            &l_linear_type,
02318                            &r_value.v,
02319                            &r_linear_type, 
02320                            &a3_value.v,
02321                            &a3_linear_type);
02322 # else
02323             mask = AR_convert((AR_DATA *)loc_result.v,
02324                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02325                          (const AR_DATA *)l_value.v,
02326                          (const AR_TYPE *)&linear_to_arith[l_linear_type]);
02327 # endif
02328 
02329             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02330             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02331 
02332             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02333                l_value.v[i] = loc_result.v[i];
02334             }
02335          }
02336 
02337          if (r_linear_type != res_linear_type &&
02338              TYP_TYPE(r_type_idx) != Typeless) {
02339 
02340             SHIFT_ARITH_ARG(r_value.v, r_linear_type);
02341 
02342 # if defined(_USE_FOLD_DOT_f)
02343             tmp_opr = Cvrt_Opr;
02344             FOLD_OPERATION(
02345                            &tmp_opr,  
02346                            &loc_result.v,
02347                            &res_linear_type,
02348                            &r_value.v,
02349                            &r_linear_type,
02350                            &r_value.v,
02351                            &r_linear_type, 
02352                            &a3_value.v,
02353                            &a3_linear_type);
02354 # else
02355              mask = AR_convert((AR_DATA *)loc_result.v,
02356                             (const AR_TYPE *)&linear_to_arith[res_linear_type],
02357                             (const AR_DATA *)r_value.v,
02358                             (const AR_TYPE *)&linear_to_arith[r_linear_type]);
02359 # endif
02360 
02361             ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02362             SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02363 
02364             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02365                r_value.v[i] = loc_result.v[i];
02366             }
02367          }
02368 
02369          SHIFT_ARITH_ARG(l_value.v, res_linear_type);
02370          SHIFT_ARITH_ARG(r_value.v, res_linear_type);
02371 
02372          arith_type = linear_to_arith[res_linear_type];
02373 
02374          if (opr != Shifta_Opr) {
02375             if (arith_type == AR_Int_32_S) {
02376                arith_type = AR_Int_32_U;
02377             }
02378             else if (arith_type == AR_Int_64_S) {
02379                arith_type = AR_Int_64_U;
02380             }
02381          }
02382 
02383 # if defined(_USE_FOLD_DOT_f)
02384          FOLD_OPERATION(
02385                         &opr,  
02386                         &loc_result.v,
02387                         &res_linear_type,
02388                         &l_value.v,
02389                         &res_linear_type,
02390                         &r_value.v,
02391                         &res_linear_type, 
02392                         &a3_value.v,
02393                         &a3_linear_type);
02394 # else
02395          switch (opr) {
02396          case Shiftl_Opr :
02397               mask = AR_shiftl((AR_DATA *)loc_result.v,
02398                                (const AR_TYPE *)&arith_type,
02399                                (const AR_DATA *)l_value.v,
02400                                (const AR_TYPE *)&arith_type,
02401                                (const AR_DATA *)r_value.v,
02402                                (const AR_TYPE *)&arith_type);
02403               break;
02404 
02405          case Shiftr_Opr :
02406          case Shifta_Opr :
02407               mask = AR_shiftr((AR_DATA *)loc_result.v,
02408                                (const AR_TYPE *)&arith_type,
02409                                (const AR_DATA *)l_value.v,
02410                                (const AR_TYPE *)&arith_type,
02411                                (const AR_DATA *)r_value.v,
02412                                (const AR_TYPE *)&arith_type);
02413               break;
02414          }
02415 
02416          /* don't check for anything but invalid type here */
02417 
02418          if ((mask & AR_STAT_INVALID_TYPE) != 0) {
02419              PRINTMSG(line, 1079, Internal, col);
02420          }
02421 # endif
02422 
02423          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02424 
02425          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02426             result[i] = loc_result.v[i];
02427          }
02428          break;
02429 
02430 
02431       case Dim_Opr :
02432          type_idx = CG_LOGICAL_DEFAULT_TYPE;
02433 
02434          ok = folder_driver((char *)l_value.v,
02435                            l_type_idx,
02436                            (char *)r_value.v,
02437                            r_type_idx,
02438                            a3_value.v,
02439                            &type_idx,
02440                            line,
02441                            col,
02442                            2,
02443                            Le_Opr);
02444 
02445          if (THIS_IS_TRUE(a3_value.v, type_idx)) {
02446             ok &= folder_driver((char *)&CN_CONST(CN_INTEGER_ZERO_IDX),
02447                                 CG_INTEGER_DEFAULT_TYPE,
02448                                 NULL,
02449                                 NULL_IDX,
02450                                 result,
02451                                 res_type_idx,
02452                                 line,
02453                                 col,
02454                                 1,
02455                                 Cvrt_Opr);
02456          }
02457          else {
02458             ok = folder_driver((char *)l_value.v,
02459                            l_type_idx,
02460                            (char *)r_value.v,
02461                            r_type_idx,
02462                            a3_value.v,
02463                            res_type_idx,
02464                            line,
02465                            col,
02466                            2,
02467                            Minus_Opr);
02468 
02469             for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02470                result[i] = a3_value.v[i];
02471             }
02472          }
02473          break;
02474 
02475 
02476 
02477       case Ichar_Opr :
02478          result[0] = l_value_ptr[0];
02479 
02480 # ifdef _TARGET32
02481          if (res_linear_type == Integer_8) {
02482             result[1] = result[0];
02483             result[0] = 0;
02484          }
02485 # endif
02486          break;
02487 
02488 
02489       case Char_Opr :
02490 # if defined(_TARGET_LITTLE_ENDIAN)
02491         /*
02492          * NOTE: 1) range checking is pre-performed by caller
02493          *       2) Integer_8 is swapped, so this works for it as well
02494          */
02495         result[0] = l_value.v[0];
02496 # else
02497 
02498 # ifdef _TARGET32
02499          if (l_linear_type == Integer_8) {
02500             l_value.v[0] = l_value.v[1];
02501          }
02502 # endif
02503          result[0] = l_value.v[0] << (TARGET_BITS_PER_WORD - CHAR_BIT);
02504 # endif
02505          break;
02506 
02507 
02508       case Index_Opr :
02509          SHIFT_ARITH_ARG(a3_value.v, a3_linear_type);
02510 
02511          str1_linear_type = TYP_LINEAR(CN_TYPE_IDX(TYP_IDX(l_type_idx)));
02512          str2_linear_type = TYP_LINEAR(CN_TYPE_IDX(TYP_IDX(r_type_idx)));
02513 
02514          for (i = 0; 
02515               i < num_host_wds[str1_linear_type];
02516               i++) {
02517 
02518             str_len1.v[i] = CP_CONSTANT(CN_POOL_IDX(TYP_IDX(l_type_idx)) + i);
02519          }
02520 
02521          for (i = 0; 
02522               i < num_host_wds[str2_linear_type];
02523               i++) {
02524 
02525             str_len2.v[i] = CP_CONSTANT(CN_POOL_IDX(TYP_IDX(r_type_idx)) + i);
02526          }
02527 
02528 # ifdef _TARGET32
02529          if (num_host_wds[str1_linear_type] != num_host_wds[res_linear_type]) {
02530             if (res_linear_type == Integer_8) {
02531                str_len1.v[1] = str_len1.v[0];
02532                str_len1.v[0] = 0;
02533             }
02534             else {
02535                str_len1.v[0] = str_len1.v[1];
02536             }
02537          }
02538 
02539          if (num_host_wds[str2_linear_type] != num_host_wds[res_linear_type]) {
02540             if (res_linear_type == Integer_8) {
02541                str_len2.v[1] = str_len2.v[0];
02542                str_len2.v[0] = 0;
02543             }
02544             else {
02545                str_len2.v[0] = str_len2.v[1];
02546             }
02547          }
02548 # endif
02549 
02550          
02551          SHIFT_ARITH_ARG(str_len1.v, res_linear_type);
02552          SHIFT_ARITH_ARG(str_len2.v, res_linear_type);
02553 
02554          mask = AR_index((AR_DATA *)loc_result.v,
02555                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02556                          (const char *)l_value_ptr,
02557                          (const AR_DATA *)str_len1.v,
02558                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02559                          (const char *)r_value_ptr,
02560                          (const AR_DATA *)str_len2.v,
02561                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02562                          (const AR_DATA *)a3_value.v,
02563                          (const AR_TYPE *)&linear_to_arith[a3_linear_type]);
02564 
02565          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02566 
02567          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02568             result[i] = loc_result.v[i];
02569          }
02570 
02571          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02572          break;
02573 
02574 
02575       case Scan_Opr :
02576          SHIFT_ARITH_ARG(a3_value.v, a3_linear_type);
02577 
02578          str1_linear_type = TYP_LINEAR(CN_TYPE_IDX(TYP_IDX(l_type_idx)));
02579          str2_linear_type = TYP_LINEAR(CN_TYPE_IDX(TYP_IDX(r_type_idx)));
02580 
02581          for (i = 0;
02582               i < num_host_wds[str1_linear_type];
02583               i++) {
02584 
02585             str_len1.v[i] = CP_CONSTANT(CN_POOL_IDX(TYP_IDX(l_type_idx)) + i);
02586          }
02587 
02588          for (i = 0;
02589               i < num_host_wds[str2_linear_type];
02590               i++) {
02591 
02592             str_len2.v[i] = CP_CONSTANT(CN_POOL_IDX(TYP_IDX(r_type_idx)) + i);
02593          }
02594 
02595 # ifdef _TARGET32
02596          if (num_host_wds[str1_linear_type] != num_host_wds[res_linear_type]) {
02597             if (res_linear_type == Integer_8) {
02598                str_len1.v[1] = str_len1.v[0];
02599                str_len1.v[0] = 0;
02600             }
02601             else {
02602                str_len1.v[0] = str_len1.v[1];
02603             }
02604          }
02605 
02606          if (num_host_wds[str2_linear_type] != num_host_wds[res_linear_type]) {
02607             if (res_linear_type == Integer_8) {
02608                str_len2.v[1] = str_len2.v[0];
02609                str_len2.v[0] = 0;
02610             }
02611             else {
02612                str_len2.v[0] = str_len2.v[1];
02613             }
02614          }
02615 # endif 
02616 
02617 
02618          SHIFT_ARITH_ARG(str_len1.v, res_linear_type);
02619          SHIFT_ARITH_ARG(str_len2.v, res_linear_type);
02620 
02621          mask = AR_scan((AR_DATA *)loc_result.v,
02622                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02623                          (const char *)l_value_ptr,
02624                          (const AR_DATA *)str_len1.v,
02625                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02626                          (const char *)r_value_ptr,
02627                          (const AR_DATA *)str_len2.v,
02628                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02629                          (const AR_DATA *)a3_value.v,
02630                          (const AR_TYPE *)&linear_to_arith[a3_linear_type]);
02631 
02632          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02633 
02634          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02635             result[i] = loc_result.v[i];
02636          }
02637 #if 0 /*fzhao March*/
02638          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02639 # endif
02640          break;
02641 
02642 
02643       case Verify_Opr :
02644          SHIFT_ARITH_ARG(a3_value.v, a3_linear_type);
02645 
02646          str1_linear_type = TYP_LINEAR(CN_TYPE_IDX(TYP_IDX(l_type_idx)));
02647          str2_linear_type = TYP_LINEAR(CN_TYPE_IDX(TYP_IDX(r_type_idx)));
02648 
02649          for (i = 0;
02650               i < num_host_wds[str1_linear_type];
02651               i++) {
02652 
02653             str_len1.v[i] = CP_CONSTANT(CN_POOL_IDX(TYP_IDX(l_type_idx)) + i);
02654          }
02655 
02656          for (i = 0;
02657               i < num_host_wds[str2_linear_type];
02658               i++) {
02659 
02660             str_len2.v[i] = CP_CONSTANT(CN_POOL_IDX(TYP_IDX(r_type_idx)) + i);
02661          }
02662 
02663 # ifdef _TARGET32
02664          if (num_host_wds[str1_linear_type] != num_host_wds[res_linear_type]) {
02665             if (res_linear_type == Integer_8) {
02666                str_len1.v[1] = str_len1.v[0];
02667                str_len1.v[0] = 0;
02668             }
02669             else {
02670                str_len1.v[0] = str_len1.v[1];
02671             }
02672          }
02673 
02674          if (num_host_wds[str2_linear_type] != num_host_wds[res_linear_type]) {
02675             if (res_linear_type == Integer_8) {
02676                str_len2.v[1] = str_len2.v[0];
02677                str_len2.v[0] = 0;
02678             }
02679             else {
02680                str_len2.v[0] = str_len2.v[1];
02681             }
02682          }
02683 # endif
02684 
02685 
02686          SHIFT_ARITH_ARG(str_len1.v, res_linear_type);
02687          SHIFT_ARITH_ARG(str_len2.v, res_linear_type);
02688 
02689 
02690          mask = AR_verify((AR_DATA *)loc_result.v,
02691                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02692                          (const char *)l_value_ptr,
02693                          (const AR_DATA *)str_len1.v,
02694                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02695                          (const char *)r_value_ptr,
02696                          (const AR_DATA *)str_len2.v,
02697                          (const AR_TYPE *)&linear_to_arith[res_linear_type],
02698                          (const AR_DATA *)a3_value.v,
02699                          (const AR_TYPE *)&linear_to_arith[a3_linear_type]);
02700 
02701          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02702 
02703          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02704             result[i] = loc_result.v[i];
02705          }
02706 
02707          ARITH_ERROR_RESULT_TEST(mask, (*res_type_idx), ok, line, col);
02708          break;
02709 
02710 
02711       case Adjustl_Opr :
02712          /* The return value is the constant tbl index for */
02713          /* the character result constant.                 */
02714 
02715          result[0] = ntr_const_tbl(l_type_idx, TRUE, NULL);
02716 
02717          *res_type_idx = l_type_idx;
02718 
02719          char_len = CN_INT_TO_C(TYP_IDX(l_type_idx));
02720 
02721          i = 0;
02722          while (i < char_len &&
02723                 l_value_ptr[i] == ' ') {
02724             i++;
02725          }
02726 
02727          char_ptr = (char *)&(CN_CONST(result[0]));
02728 
02729          for (k = 0; k < (char_len - i); k++) {
02730             char_ptr[k] = l_value_ptr[i + k];
02731          }
02732  
02733          for (; k < char_len; k++) {
02734             char_ptr[k] = ' ';
02735          }
02736          break;
02737 
02738 
02739       case Adjustr_Opr :
02740          /* The return value is the constant tbl index for */
02741          /* the character result constant.                 */
02742 
02743          result[0] = ntr_const_tbl(l_type_idx,
02744                                    TRUE,
02745                                    (long_type *) char_buf);
02746 
02747          *res_type_idx = l_type_idx;
02748 
02749          char_len = CN_INT_TO_C(TYP_IDX(l_type_idx));
02750 
02751          i = 0;
02752          while (i < char_len &&
02753                 l_value_ptr[(char_len - i) - 1] == ' ') {
02754             i++;
02755          }
02756 
02757          /* i is the number of blanks */
02758 
02759          char_ptr = (char *)&(CN_CONST(result[0]));
02760 
02761          for (k = char_len; k > i; k--) {
02762             char_ptr[k - 1] = l_value_ptr[(k - i) - 1];
02763          }
02764  
02765          for (; k > 0; k--) {
02766             char_ptr[k - 1] = ' ';
02767          }
02768          break;
02769 
02770 
02771       case Len_Trim_Opr :
02772          char_len = CN_INT_TO_C(TYP_IDX(l_type_idx));
02773          while (char_len > 0 && l_value_ptr[char_len-1] == ' ') {
02774             char_len--;
02775          }
02776 
02777          /* char_len is a C value, result is a target value */
02778 
02779          C_TO_F_INT(result, char_len, TYP_LINEAR(*res_type_idx));
02780          break;
02781 
02782 
02783       case Mask_Opr :
02784          SHIFT_ARITH_ARG(l_value.v, l_linear_type);
02785 
02786          mask = AR_mask((AR_DATA *)loc_result.v,
02787                       (const AR_TYPE *)&linear_to_arith[res_linear_type],
02788                       (const AR_DATA *)l_value.v,
02789                       (const AR_TYPE *)&linear_to_arith[res_linear_type]);
02790 
02791          /* don't check for anything but invalid type here */
02792 
02793          if ((mask & AR_STAT_INVALID_TYPE) != 0) {
02794              PRINTMSG(line, 1079, Internal, col);
02795          }
02796          SHIFT_ARITH_RESULT(loc_result.v, res_linear_type);
02797 
02798          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02799             result[i] = loc_result.v[i];
02800          }
02801          break;
02802 
02803 
02804 
02805       case Csmg_Opr :
02806          /* transform to this ... */
02807          /* csmg(x,y,z) = (x .and. z)  .or. (y .and.  (.not. z)) */
02808 
02809          type_idx = *res_type_idx;
02810 
02811          /* (x .and. z) */
02812          ok = folder_driver((char *)l_value.v,
02813                             l_type_idx,
02814                             (char *)a3_value.v,
02815                             a3_type_idx,
02816                             a4_value.v,
02817                             &type_idx,
02818                             line,
02819                             col,
02820                             2,
02821                             Band_Opr) && ok;
02822 
02823          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02824             l_value.v[i] = a4_value.v[i];
02825          }
02826          /* x now holds (x .and. z) */
02827 
02828          /* (.not. z) */
02829 
02830          ok = folder_driver((char *)a3_value.v,
02831                             a3_type_idx,
02832                             NULL,
02833                             NULL_IDX,
02834                             a4_value.v,
02835                             &type_idx,
02836                             line,
02837                             col,
02838                             1,
02839                             Bnot_Opr) && ok;
02840    
02841          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02842             a3_value.v[i] = a4_value.v[i];
02843          }
02844          /* z now holds (.not. z) */
02845    
02846          /* (y .and. (.not. z)) */
02847          ok = folder_driver((char *)r_value.v,
02848                             r_type_idx,
02849                             (char *)a3_value.v,
02850                             type_idx,
02851                             a4_value.v,
02852                             &type_idx,
02853                             line,
02854                             col,
02855                             2,
02856                             Band_Opr) && ok;
02857    
02858          for (i = 0; i < num_host_wds[res_linear_type]; i++) {
02859             r_value.v[i] = a4_value.v[i];
02860          }
02861          /* y now holds (y .and. (.not. z)) */
02862    
02863    
02864          /* (x .and. z)  .or. (y .and.  (.not. z)) */
02865    
02866          ok = folder_driver((char *)l_value.v,
02867                             type_idx,
02868                             (char *)r_value.v,
02869                             type_idx,
02870                             result,
02871                             res_type_idx,
02872                             line,
02873                             col,
02874                             2,
02875                             Bor_Opr) && ok;
02876    
02877          break;
02878 
02879       default:
02880          PRINTMSG(line, 828, Internal, col);
02881          break;
02882    }
02883 
02884 # ifdef _TARGET_OS_MAX
02885    if (res_linear_type == Complex_4) {  /* KAYKAY */
02886       /* we need to unpack it into two words */
02887       result[1] = result[0] & 0xFFFFFFFF;
02888       result[0] = result[0] >> 32;
02889    }
02890 # endif
02891 
02892 EXIT:
02893 
02894    TRACE (Func_Exit, "folder_driver", NULL);
02895 
02896    return(ok);
02897 
02898 }  /* folder_driver */
02899 
02900 
02901 /******************************************************************************\
02902 |*                                                                            *|
02903 |* Description:                                                               *|
02904 |*      Depending on input, either fold two values using the passed in        *|
02905 |*      operator, or generate IR for the two values using the passed in       *|
02906 |*      operator.                                                             *|
02907 |*                                                                            *|
02908 |* Input parameters:                                                          *|
02909 |*      *op1    Pointer to the first operator.                                *|
02910 |*      *op2    Pointer to the first operator.                                *|
02911 |*       opr    Operator to use for the calculation.                          *|
02912 |*                                                                            *|
02913 |* Output parameters:                                                         *|
02914 |*      *result Pointer to the result.                                        *|
02915 |*                                                                            *|
02916 |* Returns:                                                                   *|
02917 |*      TRUE if calculation folded okay or was created ok.                    *|
02918 |*                                                                            *|
02919 \******************************************************************************/
02920 boolean size_offset_binary_calc(size_offset_type        *op1,
02921                                 size_offset_type        *op2,
02922                                 operator_type            opr,
02923                                 size_offset_type        *result)
02924 
02925 {
02926    long_type            *constant1;
02927    long_type            *constant2;
02928    int                   i;
02929    int                   ir_idx;
02930    boolean               ok;
02931    opnd_type             opnd1;
02932    opnd_type             opnd2;
02933    boolean               symbolic_constant      = FALSE;
02934    int                   type_idx;
02935    int                   type1_idx;
02936    int                   type2_idx;
02937    long_type             result_long[MAX_WORDS_FOR_INTEGER];
02938 
02939 
02940    TRACE (Func_Entry, "size_offset_binary_calc", NULL);
02941 
02942    switch ((*op1).fld) {
02943    case NO_Tbl_Idx:
02944       constant1 = &((*op1).constant[0]);
02945       type1_idx = (*op1).type_idx;
02946       break;
02947 
02948    case CN_Tbl_Idx:
02949       constant1 = &(CN_CONST((*op1).idx));
02950       type1_idx = CN_TYPE_IDX((*op1).idx);
02951       break;
02952 
02953    case AT_Tbl_Idx:
02954       constant1         = NULL;
02955       type1_idx         = ATD_TYPE_IDX((*op1).idx);
02956       symbolic_constant = (AT_OBJ_CLASS((*op1).idx) == Data_Obj) &&
02957                            ATD_SYMBOLIC_CONSTANT((*op1).idx);
02958       break;
02959 
02960    case IR_Tbl_Idx:
02961       constant1 = NULL;
02962       type1_idx = IR_TYPE_IDX((*op1).idx);
02963       break;
02964 
02965    default:   /* IL_Tbl_Idx and SH_Tbl_Idx -> Shouldn't be, but just in case. */
02966 
02967       constant1 = NULL;
02968       type1_idx = SA_INTEGER_DEFAULT_TYPE;
02969       break;
02970 
02971    }  /* End switch */
02972 
02973 
02974    switch ((*op2).fld) {
02975    case NO_Tbl_Idx:
02976       constant2 = &((*op2).constant[0]);
02977       type2_idx = (*op2).type_idx;
02978       break;
02979 
02980    case CN_Tbl_Idx:
02981       constant2 = &(CN_CONST((*op2).idx));
02982       type2_idx = CN_TYPE_IDX((*op2).idx);
02983       break;
02984 
02985    case AT_Tbl_Idx:
02986       constant2          = NULL;
02987       type2_idx          = ATD_TYPE_IDX((*op2).idx);
02988       symbolic_constant |= (AT_OBJ_CLASS((*op2).idx) == Data_Obj) &&
02989                             ATD_SYMBOLIC_CONSTANT((*op2).idx);
02990       break;
02991 
02992    case IR_Tbl_Idx:
02993       constant2 = NULL;
02994       type2_idx = IR_TYPE_IDX((*op2).idx);
02995       break;
02996 
02997    default:   /* IL_Tbl_Idx and SH_Tbl_Idx -> Shouldn't be, but just in case. */
02998 
02999       constant2 = NULL;
03000       type2_idx = SA_INTEGER_DEFAULT_TYPE;
03001       break;
03002 
03003    }  /* End switch */
03004 
03005 
03006    if (constant1 != NULL && constant2 != NULL) {
03007       type_idx = (TYP_LINEAR(type2_idx) > TYP_LINEAR(type1_idx)) ? type2_idx :
03008                                                                    type1_idx;
03009       
03010       issue_overflow_msg_719 = FALSE;
03011 
03012       ok = folder_driver((char *) constant1,
03013                          type1_idx,
03014                          (char *) constant2,
03015                          type2_idx,
03016                          result_long,
03017                          &type_idx,
03018                          stmt_start_line,
03019                          stmt_start_col,
03020                          2,
03021                          opr);
03022 
03023       if (need_to_issue_719) {
03024 
03025          if (TYP_LINEAR(type_idx) < LARGEST_INTEGER_TYPE) {
03026             need_to_issue_719   = FALSE;
03027             type_idx            = LARGEST_INTEGER_TYPE;
03028             ok                  |= folder_driver((char *) constant1,
03029                                                  type1_idx,
03030                                                  (char *) constant2,
03031                                                  type2_idx,
03032                                                  result_long,
03033                                                  &type_idx,
03034                                                  stmt_start_line,
03035                                                  stmt_start_col,
03036                                                  2,
03037                                                  opr);
03038           }
03039 
03040          if (need_to_issue_719) {
03041             PRINTMSG(stmt_start_line, 1175, Error, stmt_start_col);
03042             need_to_issue_719   = FALSE;
03043          }
03044       }
03045 
03046       for (i = 0; i < MAX_WORDS_FOR_INTEGER; i++) {
03047          (*result).constant[i]  = result_long[i];
03048       }
03049  
03050       (*result).type_idx        = type_idx;
03051       (*result).fld             = NO_Tbl_Idx;
03052       issue_overflow_msg_719    = TRUE;
03053    }
03054    else {
03055 
03056       /* One or the other may be constant, but not both.   */
03057       /* But to generate IR we need both as table indexes. */
03058 
03059       if ((*op1).fld == NO_Tbl_Idx) { 
03060          (*op1).idx = ntr_const_tbl((*op1).type_idx, FALSE, (*op1).constant);
03061          (*op1).fld = CN_Tbl_Idx;
03062       }
03063       else if ((*op2).fld == NO_Tbl_Idx) {
03064          (*op2).idx = ntr_const_tbl((*op2).type_idx, FALSE, (*op2).constant);
03065          (*op2).fld = CN_Tbl_Idx;
03066       }
03067 
03068       OPND_FLD(opnd1)           = (*op1).fld;
03069       OPND_IDX(opnd1)           = (*op1).idx;
03070       OPND_LINE_NUM(opnd1)      = stmt_start_line;
03071       OPND_COL_NUM(opnd1)       = stmt_start_col;
03072 
03073       OPND_FLD(opnd2)           = (*op2).fld;
03074       OPND_IDX(opnd2)           = (*op2).idx;
03075       OPND_LINE_NUM(opnd2)      = stmt_start_line;
03076       OPND_COL_NUM(opnd2)       = stmt_start_col;
03077 
03078       if (!symbolic_constant) {
03079          type1_idx = check_type_for_size_address(&opnd1);
03080          type2_idx = check_type_for_size_address(&opnd2);
03081       }
03082 
03083       type_idx  = (TYP_LINEAR(type2_idx) > TYP_LINEAR(type1_idx)) ? type2_idx :
03084                                                                     type1_idx;
03085 
03086       NTR_IR_TBL(ir_idx);
03087       IR_TYPE_IDX(ir_idx)       = type_idx;
03088       IR_LINE_NUM_L(ir_idx)     = stmt_start_line;
03089       IR_LINE_NUM_R(ir_idx)     = stmt_start_line;
03090       IR_LINE_NUM(ir_idx)       = stmt_start_line;
03091       IR_COL_NUM_L(ir_idx)      = stmt_start_col;
03092       IR_COL_NUM_R(ir_idx)      = stmt_start_col;
03093       IR_COL_NUM(ir_idx)        = stmt_start_col;
03094       IR_FLD_L(ir_idx)          = OPND_FLD(opnd1);
03095       IR_IDX_L(ir_idx)          = OPND_IDX(opnd1);
03096       IR_FLD_R(ir_idx)          = OPND_FLD(opnd2);
03097       IR_IDX_R(ir_idx)          = OPND_IDX(opnd2);
03098 
03099       if (symbolic_constant) {
03100 
03101          switch(opr) {
03102          case Plus_Opr:
03103             opr         = Symbolic_Plus_Opr;
03104             break;
03105 
03106          case Div_Opr:
03107             opr         = Symbolic_Div_Opr;
03108             break;
03109 
03110          case Mult_Opr:
03111             opr         = Symbolic_Mult_Opr;
03112             break;
03113 
03114          case Minus_Opr:
03115             opr         = Symbolic_Minus_Opr;
03116             break;
03117 
03118          case Mod_Opr:
03119             opr         = Symbolic_Mod_Opr;
03120             break;
03121 
03122          case Shiftl_Opr:
03123             opr         = Symbolic_Shiftl_Opr;
03124             break;
03125 
03126          case Shiftr_Opr:
03127             opr         = Symbolic_Shiftr_Opr;
03128             break;
03129          }
03130 
03131          (*result).fld  = AT_Tbl_Idx;
03132          (*result).idx  = gen_compiler_tmp(stmt_start_line, stmt_start_col,
03133                                            Priv, TRUE);
03134 
03135          ATD_TYPE_IDX((*result).idx)            = INTEGER_DEFAULT_TYPE;
03136          ATD_FLD((*result).idx)                 = IR_Tbl_Idx;
03137          ATD_TMP_IDX((*result).idx)             = ir_idx;
03138          ATD_SYMBOLIC_CONSTANT((*result).idx)   = TRUE;
03139       }
03140       else {
03141          (*result).idx          = ir_idx;
03142          (*result).fld          = IR_Tbl_Idx;
03143       }
03144 
03145       IR_OPR(ir_idx)            = opr;
03146       ok                        = TRUE;
03147    }
03148 
03149    TRACE (Func_Exit, "size_offset_binary_calc", NULL);
03150 
03151    return(ok);
03152 
03153 }  /* size_offset_binary_calc */
03154 
03155 
03156 /******************************************************************************\
03157 |*                                                                            *|
03158 |* Description:                                                               *|
03159 |*      Depending on input, either fold two values using the passed in        *|
03160 |*      operator, or generate IR for the two values using the passed in       *|
03161 |*      operator.                                                             *|
03162 |*                                                                            *|
03163 |* Input parameters:                                                          *|
03164 |*      *op1    Pointer to the first operator.                                *|
03165 |*      *op2    Pointer to the first operator.                                *|
03166 |*       opr    Operator to use for the calculation.                          *|
03167 |*                                                                            *|
03168 |* Output parameters:                                                         *|
03169 |*      *result Pointer to the result.                                        *|
03170 |*                                                                            *|
03171 |* Returns:                                                                   *|
03172 |*      TRUE if calculation folded okay or was created ok.                    *|
03173 |*                                                                            *|
03174 \******************************************************************************/
03175 boolean size_offset_logical_calc(size_offset_type       *op1,
03176                                  size_offset_type       *op2,
03177                                  operator_type           opr,
03178                                  size_offset_type       *result)
03179 
03180 {
03181    long_type            *constant1;
03182    long_type            *constant2;
03183    int                   ir_idx;
03184    boolean               ok;
03185    int                   type_idx;
03186    int                   type1_idx;
03187    int                   type2_idx;
03188  
03189 
03190    TRACE (Func_Entry, "size_offset_logical_calc", NULL);
03191 
03192    switch ((*op1).fld) {
03193    case NO_Tbl_Idx:
03194       constant1 = &((*op1).constant[0]);
03195       type1_idx = (*op1).type_idx;
03196       break;
03197 
03198    case CN_Tbl_Idx:
03199       constant1 = &(CN_CONST((*op1).idx));
03200       type1_idx = CN_TYPE_IDX((*op1).idx);
03201       break;
03202 
03203    case AT_Tbl_Idx:
03204       constant1 = NULL;
03205       type1_idx = ATD_TYPE_IDX((*op1).idx);
03206       break;
03207 
03208    case IR_Tbl_Idx:
03209       constant1 = NULL;
03210       type1_idx = IR_TYPE_IDX((*op1).idx);
03211       break;
03212 
03213    default:   /* IL_Tbl_Idx and SH_Tbl_Idx -> Shouldn't be, but just in case. */
03214 
03215       constant1 = NULL;
03216       type1_idx = CG_INTEGER_DEFAULT_TYPE;
03217       break;
03218 
03219    }  /* End switch */
03220 
03221 
03222    switch ((*op2).fld) {
03223    case NO_Tbl_Idx:
03224       constant2 = &((*op2).constant[0]);
03225       type2_idx = (*op2).type_idx;
03226       break;
03227 
03228    case CN_Tbl_Idx:
03229       constant2 = &(CN_CONST((*op2).idx));
03230       type2_idx = CN_TYPE_IDX((*op2).idx);
03231       break;
03232 
03233    case AT_Tbl_Idx:
03234       constant2 = NULL;
03235       type2_idx = ATD_TYPE_IDX((*op2).idx);
03236       break;
03237 
03238    case IR_Tbl_Idx:
03239       constant2 = NULL;
03240       type2_idx = IR_TYPE_IDX((*op2).idx);
03241       break;
03242 
03243    default:   /* IL_Tbl_Idx and SH_Tbl_Idx -> Shouldn't be, but just in case. */
03244 
03245       constant2 = NULL;
03246       type2_idx = CG_INTEGER_DEFAULT_TYPE;
03247       break;
03248 
03249    }  /* End switch */
03250 
03251    type_idx = CG_LOGICAL_DEFAULT_TYPE;
03252 
03253    if (constant1 != NULL && constant2 != NULL) {
03254       
03255       ok = folder_driver((char *) constant1,
03256                          type1_idx,
03257                          (char *) constant2,
03258                          type2_idx,
03259                          (*result).constant,
03260                          &type_idx,
03261                          stmt_start_line,
03262                          stmt_start_col,
03263                          2,
03264                          opr);
03265 
03266       (*result).type_idx        = type_idx;
03267       (*result).fld             = NO_Tbl_Idx;
03268    }
03269    else {
03270 
03271       /* One or the other may be constant, but not both.   */
03272       /* But to generate IR we need both as table indexes. */
03273 
03274       if ((*op1).fld == NO_Tbl_Idx) { 
03275          (*op1).idx = ntr_const_tbl((*op1).type_idx, FALSE, (*op1).constant);
03276          (*op1).fld = CN_Tbl_Idx;
03277       }
03278       else if ((*op2).fld == NO_Tbl_Idx) {
03279          (*op2).idx = ntr_const_tbl((*op2).type_idx, FALSE, (*op2).constant);
03280          (*op2).fld = CN_Tbl_Idx;
03281       }
03282 
03283       NTR_IR_TBL(ir_idx);
03284 
03285       IR_TYPE_IDX(ir_idx)       = type_idx;
03286       IR_LINE_NUM_L(ir_idx)     = stmt_start_line;
03287       IR_LINE_NUM_R(ir_idx)     = stmt_start_line;
03288       IR_LINE_NUM(ir_idx)       = stmt_start_line;
03289       IR_COL_NUM_L(ir_idx)      = stmt_start_col;
03290       IR_COL_NUM_R(ir_idx)      = stmt_start_col;
03291       IR_COL_NUM(ir_idx)        = stmt_start_col;
03292       IR_OPR(ir_idx)            = opr;
03293       IR_IDX_L(ir_idx)          = (*op1).idx;
03294       IR_FLD_L(ir_idx)          = (*op1).fld;
03295       IR_IDX_R(ir_idx)          = (*op2).idx;
03296       IR_FLD_R(ir_idx)          = (*op2).fld;
03297 
03298       (*result).idx             = ir_idx;
03299       (*result).fld             = IR_Tbl_Idx;
03300       ok                        = TRUE;
03301    }
03302 
03303    TRACE (Func_Exit, "size_offset_logical_calc", NULL);
03304 
03305    return(ok);
03306 
03307 }  /* size_offset_logical_calc */
03308 
03309 
03310 /******************************************************************************\
03311 |*                                                                            *|
03312 |* Description:                                                               *|
03313 |*      Depending on input, either fold the list of values using the Min_Opr  *|
03314 |*      or generate IR for the list of values using the Min_Opr.              *|
03315 |*                                                                            *|
03316 |* Input parameters:                                                          *|
03317 |*      *op1    Pointer to the first operator.                                *|
03318 |*      *op2    Pointer to the first operator.                                *|
03319 |*                                                                            *|
03320 |* Output parameters:                                                         *|
03321 |*      *result Pointer to the result.                                        *|
03322 |*                                                                            *|
03323 |* Returns:                                                                   *|
03324 |*      TRUE if calculation folded okay or was created ok.                    *|
03325 |*                                                                            *|
03326 \******************************************************************************/
03327 boolean size_offset_min_max_calc(size_offset_type       *op1,
03328                                  size_offset_type       *op2,
03329                                  operator_type           operator,
03330                                  size_offset_type       *result)
03331 
03332 {
03333    long_type            *constant1;
03334    long_type            *constant2;
03335    int                   il_idx;
03336    int                   il_idx2;
03337    int                   ir_idx;
03338    boolean               ok;
03339    opnd_type             opnd1;
03340    opnd_type             opnd2;
03341    boolean               symbolic_constant;
03342    int                   type_idx;
03343    int                   type1_idx;
03344    int                   type2_idx;
03345  
03346 
03347    TRACE (Func_Entry, "size_offset_min_calc", NULL);
03348 
03349    switch ((*op1).fld) {
03350    case NO_Tbl_Idx:
03351       constant1 = &((*op1).constant[0]);
03352       type1_idx = (*op1).type_idx;
03353       break;
03354 
03355    case CN_Tbl_Idx:
03356       constant1 = &(CN_CONST((*op1).idx));
03357       type1_idx = CN_TYPE_IDX((*op1).idx);
03358       break;
03359 
03360    case AT_Tbl_Idx:
03361       constant1 = NULL;
03362       type1_idx = ATD_TYPE_IDX((*op1).idx);
03363       symbolic_constant = (AT_OBJ_CLASS((*op1).idx) == Data_Obj) &&
03364                            ATD_SYMBOLIC_CONSTANT((*op1).idx);
03365       break;
03366 
03367    case IR_Tbl_Idx:
03368       constant1 = NULL;
03369       type1_idx = IR_TYPE_IDX((*op1).idx);
03370       break;
03371 
03372    default:   /* IL_Tbl_Idx and SH_Tbl_Idx -> Shouldn't be, but just in case. */
03373 
03374       constant1 = NULL;
03375       type1_idx = CG_INTEGER_DEFAULT_TYPE;
03376       break;
03377 
03378    }  /* End switch */
03379 
03380 
03381    switch ((*op2).fld) {
03382    case NO_Tbl_Idx:
03383       constant2 = &((*op2).constant[0]);
03384       type2_idx = (*op2).type_idx;
03385       break;
03386 
03387    case CN_Tbl_Idx:
03388       constant2 = &(CN_CONST((*op2).idx));
03389       type2_idx = CN_TYPE_IDX((*op2).idx);
03390       break;
03391 
03392    case AT_Tbl_Idx:
03393       constant2 = NULL;
03394       type2_idx = ATD_TYPE_IDX((*op2).idx);
03395       symbolic_constant |= (AT_OBJ_CLASS((*op2).idx) == Data_Obj) &&
03396                            ATD_SYMBOLIC_CONSTANT((*op2).idx);
03397       break;
03398 
03399    case IR_Tbl_Idx:
03400       constant2 = NULL;
03401       type2_idx = IR_TYPE_IDX((*op2).idx);
03402       break;
03403 
03404    default:   /* IL_Tbl_Idx and SH_Tbl_Idx -> Shouldn't be, but just in case. */
03405       constant2 = NULL;
03406       type2_idx = CG_INTEGER_DEFAULT_TYPE;
03407       break;
03408 
03409    }  /* End switch */
03410 
03411    if (constant1 != NULL && constant2 != NULL) {
03412       type_idx = CG_LOGICAL_DEFAULT_TYPE;
03413       
03414       ok = folder_driver((char *) constant1,
03415                          type1_idx,
03416                          (char *) constant2,
03417                          type2_idx,
03418                          (*result).constant,
03419                          &type_idx,
03420                          stmt_start_line,
03421                          stmt_start_col,
03422                          2,
03423                          Lt_Opr);
03424 
03425       if (THIS_IS_TRUE((*result).constant, (*result).type_idx)) {
03426          (*result)      = (operator == Min_Opr) ? (*op1) : (*op2);
03427       }
03428       else {
03429          (*result)      = (operator == Min_Opr) ? (*op2) : (*op1);
03430       }
03431    }
03432    else {
03433 
03434       /* One or the other may be constant, but not both.   */
03435       /* But to generate IR we need both as table indexes. */
03436 
03437       if ((*op1).fld == NO_Tbl_Idx) { 
03438          (*op1).idx = ntr_const_tbl((*op1).type_idx, FALSE, (*op1).constant);
03439          (*op1).fld = CN_Tbl_Idx;
03440       }
03441       else if ((*op2).fld == NO_Tbl_Idx) {
03442          (*op2).idx = ntr_const_tbl((*op2).type_idx, FALSE, (*op2).constant);
03443          (*op2).fld = CN_Tbl_Idx;
03444       }
03445 
03446       OPND_FLD(opnd1)           = (*op1).fld;
03447       OPND_IDX(opnd1)           = (*op1).idx;
03448       OPND_LINE_NUM(opnd1)      = stmt_start_line;
03449       OPND_COL_NUM(opnd1)       = stmt_start_col;
03450 
03451       OPND_FLD(opnd2)           = (*op2).fld;
03452       OPND_IDX(opnd2)           = (*op2).idx;
03453       OPND_LINE_NUM(opnd2)      = stmt_start_line;
03454       OPND_COL_NUM(opnd2)       = stmt_start_col;
03455 
03456       if (!symbolic_constant) {
03457          type1_idx = check_type_for_size_address(&opnd1);
03458          type2_idx = check_type_for_size_address(&opnd2);
03459       }
03460 
03461       type_idx  = (TYP_LINEAR(type2_idx) > TYP_LINEAR(type1_idx)) ? type2_idx :
03462                                                                     type1_idx;
03463 
03464       NTR_IR_TBL(ir_idx);
03465 
03466       IR_TYPE_IDX(ir_idx)       = type_idx;
03467       IR_LINE_NUM(ir_idx)       = stmt_start_line;
03468       IR_COL_NUM(ir_idx)        = stmt_start_col;
03469 
03470       if (operator == Min_Opr) {
03471          IR_OPR(ir_idx)         = (symbolic_constant) ? Symbolic_Min_Opr :
03472                                                         Min_Opr;
03473       }
03474       else {
03475          IR_OPR(ir_idx)         = (symbolic_constant) ? Symbolic_Max_Opr :
03476                                                         Max_Opr;
03477       }
03478       IR_FLD_L(ir_idx)          = IL_Tbl_Idx;
03479       IR_LIST_CNT_L(ir_idx)     = 2;
03480 
03481       NTR_IR_LIST_TBL(il_idx);
03482       IL_LINE_NUM(il_idx)       = stmt_start_line;
03483       IL_COL_NUM(il_idx)        = stmt_start_col;
03484       IL_FLD(il_idx)            = OPND_FLD(opnd1);
03485       IL_IDX(il_idx)            = OPND_IDX(opnd1);
03486 
03487       IR_IDX_L(ir_idx)          = il_idx;
03488 
03489       NTR_IR_LIST_TBL(il_idx2);
03490       IL_LINE_NUM(il_idx2)      = stmt_start_line;
03491       IL_COL_NUM(il_idx2)       = stmt_start_col;
03492       IL_FLD(il_idx2)           = OPND_FLD(opnd2);
03493       IL_IDX(il_idx2)           = OPND_IDX(opnd2);
03494       IL_PREV_LIST_IDX(il_idx2) = il_idx;
03495 
03496       IL_NEXT_LIST_IDX(il_idx)  = il_idx2;
03497 
03498       (*result).idx             = ir_idx;
03499       (*result).fld             = IR_Tbl_Idx;
03500       ok                        = TRUE;
03501    }
03502 
03503    TRACE (Func_Exit, "size_offset_min_calc", NULL);
03504 
03505    return(ok);
03506 
03507 }  /* size_offset_min_calc */
03508 
03509 /******************************************************************************\
03510 |*                                                                            *|
03511 |* Description:                                                               *|
03512 |*      The following routine makes sure that integer constant                *|
03513 |*      entries can be used in 'C' arithmetic and comparison.                 *|
03514 |*                                                                            *|
03515 |* Input parameters:                                                          *|
03516 |*      NONE                                                                  *|
03517 |*                                                                            *|
03518 |* Output parameters:                                                         *|
03519 |*      NONE                                                                  *|
03520 |*                                                                            *|
03521 |* Returns:                                                                   *|
03522 |*      NOTHING                                                               *|
03523 |*                                                                            *|
03524 \******************************************************************************/
03525 
03526 long64  f_int_to_cval(long_type         *the_constant,
03527                       int                lin_type)
03528 
03529 {
03530    int          i;
03531    long_type    input[MAX_WORDS_FOR_INTEGER];
03532    long64       result;
03533 
03534 
03535    TRACE (Func_Entry, "f_int_to_cval", NULL);
03536 
03537    for (i = 0; i < num_host_wds[TYP_LINEAR(lin_type)]; i++) {
03538        input[i] = the_constant[i];
03539    }
03540 
03541    SHIFT_ARITH_ARG(input, lin_type);
03542 
03543    i = AR_convert_int_to_host_sint64((AR_HOST_SINT64 *) &result,
03544                                  (const AR_DATA *) &input,
03545                                  (const AR_TYPE *) &linear_to_arith[lin_type]);
03546 
03547    TRACE (Func_Exit, "f_int_to_cval", NULL);
03548 
03549    return(result);
03550 
03551 }  /* f_int_to_cval */
03552 
03553 /******************************************************************************\
03554 |*                                                                            *|
03555 |* Description:                                                               *|
03556 |*      The following routine makes sure that a 'C' constant translates back  *|
03557 |*      to a target constant.  This is used where host and target             *|
03558 |*      representation of constants is not the same.  Endian and host/target  *|
03559 |*      sizes differing are two examples of where this is used.  It is the    *|
03560 |*      underlying routine used by the macro.  C_TO_F_INT                     *|
03561 |*      Use the macro - do not use this routine directly, as on most          *|
03562 |*      platforms, this much overhead is not necessary.                       *|
03563 |*                                                                            *|
03564 |* Input parameters:                                                          *|
03565 |*      NONE                                                                  *|
03566 |*                                                                            *|
03567 |* Output parameters:                                                         *|
03568 |*      NONE                                                                  *|
03569 |*                                                                            *|
03570 |* Returns:                                                                   *|
03571 |*      NOTHING                                                               *|
03572 |*                                                                            *|
03573 \******************************************************************************/
03574 int     cval_to_f_int(long_type *result,
03575                       long64    *the_constant,
03576                       int        type_idx)
03577 
03578 {
03579    int          lin_type;
03580    int          ret;
03581 
03582 
03583    TRACE (Func_Entry, "cval_to_f_int", NULL);
03584 
03585    lin_type = (type_idx == NULL_IDX) ? CG_INTEGER_DEFAULT_TYPE :
03586                                        TYP_LINEAR(type_idx);
03587 
03588    ret = AR_convert_host_sint64_to_int((AR_DATA *)  result,
03589                                  (const AR_TYPE *) &linear_to_arith[lin_type],
03590                                        (AR_HOST_SINT64) *the_constant);
03591 
03592 
03593    if (ret == AR_STAT_OVERFLOW) {  /* Overflowed specified type */
03594 
03595       if (type_idx == NULL_IDX &&
03596           CG_INTEGER_DEFAULT_TYPE < LARGEST_INTEGER_TYPE) {
03597          lin_type = LARGEST_INTEGER_TYPE;
03598          ret = AR_convert_host_sint64_to_int(
03599                           (AR_DATA *)  result,
03600                     (const AR_TYPE *) &linear_to_arith[LARGEST_INTEGER_TYPE],
03601                           (AR_HOST_SINT64) *the_constant);
03602       }
03603 
03604       if (ret == AR_STAT_OVERFLOW) { /* Still overflowed */
03605          PRINTMSG(stmt_start_line, 719, Error, stmt_start_col);
03606          lin_type = Err_Res;
03607       }
03608       else {
03609          SHIFT_ARITH_RESULT(result, lin_type);
03610       }
03611    }
03612    else {
03613       SHIFT_ARITH_RESULT(result, lin_type);
03614    }
03615 
03616    TRACE (Func_Exit, "cval_to_f_int", NULL);
03617 
03618    return(lin_type);
03619 
03620 }  /* cval_to_f_int */
03621 
03622 /******************************************************************************\
03623 |*                                                                            *|
03624 |* Description:                                                               *|
03625 |*      The following routine enters a 'C' (host) integer constant into the   *|
03626 |*      constant table.                                                       *|
03627 |*                                                                            *|
03628 |* Input parameters:                                                          *|
03629 |*      NONE                                                                  *|
03630 |*                                                                            *|
03631 |* Output parameters:                                                         *|
03632 |*      NONE                                                                  *|
03633 |*                                                                            *|
03634 |* Returns:                                                                   *|
03635 |*      NOTHING                                                               *|
03636 |*                                                                            *|
03637 \******************************************************************************/
03638 int     ntr_int_const_tbl(int           type_idx,
03639                           long64        constant)
03640 
03641 {
03642    int           cn_idx;
03643    long_type     the_constant[MAX_WORDS_FOR_INTEGER];
03644 
03645 # if !defined(_HOST64) || !defined(_TARGET64)
03646    int           new_type;
03647 
03648 # if defined(GENERATE_WHIRL)
03649    long         *cn_ptr; 
03650 # endif
03651 # endif
03652 
03653 
03654    TRACE (Func_Entry, "ntr_int_const_tbl", NULL);
03655 
03656 # if defined(_HOST64) && defined(_TARGET64)
03657 
03658    if (type_idx == NULL_IDX) {
03659       type_idx = CG_INTEGER_DEFAULT_TYPE;
03660    }
03661 
03662    the_constant[0] = constant;
03663 
03664 # elif defined(_USE_FOLD_DOT_f)
03665    if (type_idx == NULL_IDX) {
03666       type_idx = CG_INTEGER_DEFAULT_TYPE;
03667    }
03668 
03669    if (TYP_LINEAR(type_idx) == Integer_8 ||
03670        TYP_LINEAR(type_idx) == Typeless_8) {
03671       cn_ptr = (long *) &constant;
03672       the_constant[0] = *cn_ptr;
03673       if (MAX_WORDS_FOR_INTEGER > 1 )
03674         the_constant[1] = *(++cn_ptr);
03675    }
03676    else {
03677       the_constant[0] = constant;
03678       if (MAX_WORDS_FOR_INTEGER > 1 )
03679         the_constant[1] = 0;
03680    }
03681 
03682 # elif defined(GENERATE_WHIRL)
03683 
03684    if (type_idx == NULL_IDX) { /* Set type according to size */
03685       new_type = cval_to_f_int(the_constant,
03686                                &constant,
03687                                NULL_IDX);
03688 
03689       if (new_type == NULL_IDX) {  /* Error situation */
03690          type_idx = CG_INTEGER_DEFAULT_TYPE;
03691       }
03692       else {
03693          type_idx = TYP_LINEAR(new_type);
03694       }
03695    }
03696    else {  /* Use type passed in */
03697 
03698       if (TYP_LINEAR(type_idx) == Integer_8 || 
03699           TYP_LINEAR(type_idx) == Typeless_8) {
03700          cn_ptr = (long *) &constant;
03701          the_constant[0] = *cn_ptr;     
03702          if (MAX_WORDS_FOR_INTEGER > 1 )
03703             the_constant[1] = *(++cn_ptr);
03704       }
03705       else { 
03706          the_constant[0] = (long) constant;
03707          if (MAX_WORDS_FOR_INTEGER > 1 )
03708            the_constant[1] = 0;
03709       }
03710    }
03711 
03712 # else
03713 
03714    /* NOTE:  type_idx may be NULL_IDX.  Then we want cval_to_f_int to */
03715    /*        determine what the type_idx should be for this constant. */
03716 
03717    new_type     = cval_to_f_int(the_constant,
03718                                 &constant,
03719                                 type_idx);
03720 
03721    if (new_type == NULL_IDX) {  /* Error situation */
03722       type_idx = CG_INTEGER_DEFAULT_TYPE;
03723    }
03724    else {
03725       type_idx = TYP_LINEAR(new_type);
03726    }
03727 
03728 # endif
03729 
03730    cn_idx = ntr_const_tbl(type_idx,
03731                           FALSE,
03732                           the_constant);
03733 
03734    TRACE (Func_Exit, "ntr_int_const_tbl", NULL);
03735 
03736    return(cn_idx);
03737 
03738 }  /* ntr_int_const_tbl */
03739 
03740 /******************************************************************************\
03741 |*                                                                            *|
03742 |* Description:                                                               *|
03743 |*      On mpp systems,  the macro CN_INT_TO_C calls this routine to ensure   *|
03744 |*      sign extension when veiwing 32 bit ints as c ints.                    *|
03745 |*                                                                            *|
03746 |* Input parameters:                                                          *|
03747 |*      NONE                                                                  *|
03748 |*                                                                            *|
03749 |* Output parameters:                                                         *|
03750 |*      NONE                                                                  *|
03751 |*                                                                            *|
03752 |* Returns:                                                                   *|
03753 |*      NOTHING                                                               *|
03754 |*                                                                            *|
03755 \******************************************************************************/
03756 long_type       mpp_cn_int_to_c(int             cn_idx)
03757 
03758 {
03759    long_type            the_constant;
03760    int                  type_idx;
03761 
03762    TRACE (Func_Entry, "mpp_cn_int_to_c", NULL);
03763 
03764    if (TYP_LINEAR(CN_TYPE_IDX(cn_idx)) == Integer_1 ||
03765        TYP_LINEAR(CN_TYPE_IDX(cn_idx)) == Integer_2 ||
03766        TYP_LINEAR(CN_TYPE_IDX(cn_idx)) == Integer_4) {
03767 
03768       type_idx = CG_INTEGER_DEFAULT_TYPE;
03769 
03770       if (folder_driver((char *)&CN_CONST(cn_idx),
03771                         CN_TYPE_IDX(cn_idx),
03772                         NULL,
03773                         NULL_IDX,
03774                         &the_constant,
03775                         &type_idx,
03776                         stmt_start_line,
03777                         stmt_start_col,
03778                         1,
03779                         Cvrt_Opr)) {
03780          /* intentionally blank */
03781       }
03782    }
03783    else {
03784       the_constant = CN_CONST(cn_idx);
03785    }
03786 
03787    TRACE (Func_Exit, "mpp_cn_int_to_c", NULL);
03788 
03789    return(the_constant);
03790 
03791 }  /* mpp_cn_int_to_c */
03792 
03793 /******************************************************************************\
03794 |*                                                                            *|
03795 |* Description:                                                               *|
03796 |*                                                                            *|
03797 |* Input parameters:                                                          *|
03798 |*                                                                            *|
03799 |* Output parameters:                                                         *|
03800 |*      NONE                                                                  *|
03801 |*                                                                            *|
03802 |* Returns:                                                                   *|
03803 |*      TRUE if they are the same, else FALSE.                                *|
03804 |*                                                                            *|
03805 \******************************************************************************/
03806 
03807 boolean compare_target_consts(long_type *const1,
03808                               int        type1,
03809                               long_type  *const2,
03810                               int        type2,
03811                               int        opr)
03812 
03813 {
03814    boolean      is_true;
03815    long_type    result[MAX_WORDS_FOR_INTEGER];
03816    int          type_idx;
03817 
03818 
03819    TRACE (Func_Entry, "compare_target_consts", NULL);
03820 
03821    type_idx = LOGICAL_DEFAULT_TYPE;
03822 
03823    if (folder_driver((char *)const1,
03824                      type1,
03825                      (char *)const2,
03826                      type2,
03827                      result,
03828                     &type_idx,
03829                      stmt_start_line,
03830                      stmt_start_col,
03831                      2,
03832                      opr)) {
03833 
03834       is_true = THIS_IS_TRUE(result, type_idx);
03835    }
03836    else {
03837       is_true = FALSE;
03838    }
03839 
03840    TRACE (Func_Exit, "compare_target_consts", NULL);
03841 
03842    return(is_true);
03843 
03844 }  /* compare_target_consts */
03845 
03846 
03847 # ifdef _USE_FOLD_DOT_f
03848 
03849 /******************************************************************************\
03850 |*                                                                            *|
03851 |* Description:                                                               *|
03852 |*      ONLY FOR THE LINUX COMPILER. USE UNTIL ARITH IS READY.                *|
03853 |*                                                                            *|
03854 |*      Use sscanf to convert strings to host format constants for integer    *|
03855 |*      and real types.  No error detection.                                  *|
03856 |*                                                                            *|
03857 |* Input parameters:                                                          *|
03858 |*      NONE                                                                  *|
03859 |*                                                                            *|
03860 |* Output parameters:                                                         *|
03861 |*      NONE                                                                  *|
03862 |*                                                                            *|
03863 |* Returns:                                                                   *|
03864 |*      NOTHING                                                               *|
03865 |*                                                                            *|
03866 \******************************************************************************/
03867 
03868 void kludge_input_conversion (char      *str, 
03869                               int       type_idx)
03870 {
03871    int          i;
03872    long_type    number[MAX_WORDS_FOR_NUMERIC];
03873 
03874    for (i = 0; i < MAX_WORDS_FOR_NUMERIC; i++) {
03875       number[i] = 0;
03876    }
03877 
03878    switch (TYP_LINEAR(type_idx)) {
03879    case Integer_1:
03880    case Integer_2:
03881    case Integer_4:
03882       sscanf(str, "%lu", (long *)number);
03883       break;
03884 
03885    case Integer_8:
03886       sscanf(str, "%lld", (long long *)number);
03887       break;
03888 
03889    case Real_4:
03890       sscanf(str, "%f", (float *)number);
03891       break;
03892 
03893    case Real_8:
03894       sscanf(str, "%lf", (double *)number);
03895       break;
03896 
03897    case Real_16:
03898       sscanf(str, "%Lf", (long double *)number);
03899       break;
03900 
03901    default:
03902       PRINTMSG(stmt_start_line, 626, Internal, stmt_start_col,
03903                "Integer or Real type", "kludge_input_conversion");
03904       break;
03905    }
03906 
03907    TOKEN_CONST_TBL_IDX(token) = ntr_const_tbl(type_idx,
03908                                               FALSE, 
03909                                               number);
03910 }
03911 
03912 /******************************************************************************\
03913 |*                                                                            *|
03914 |* Description:                                                               *|
03915 |*      ONLY FOR THE LINUX COMPILER. USE UNTIL ARITH IS READY.                *|
03916 |*                                                                            *|
03917 |*      Use sprintf to convert host format constants to strings for integer   *|
03918 |*      and real types.  No error detection.                                  *|
03919 |*                                                                            *|
03920 |* Input parameters:                                                          *|
03921 |*      NONE                                                                  *|
03922 |*                                                                            *|
03923 |* Output parameters:                                                         *|
03924 |*      NONE                                                                  *|
03925 |*                                                                            *|
03926 |* Returns:                                                                   *|
03927 |*      NOTHING                                                               *|
03928 |*                                                                            *|
03929 \******************************************************************************/
03930 
03931 void kludge_output_conversion (long_type *the_constant,
03932                                int       type_idx,
03933                                char      *str)
03934 {
03935 
03936    switch (TYP_LINEAR(type_idx)) {
03937    case Integer_1:
03938    case Integer_2:
03939    case Integer_4:
03940       sprintf(str, "%ld", *(long *)the_constant);
03941       break;
03942 
03943    case Integer_8:
03944       sprintf(str, "%lld", *(long long *)the_constant);
03945       break;
03946 
03947    case Real_4:
03948       sprintf(str, "%f", *(float *)the_constant);
03949       break;
03950 
03951    case Real_8:
03952       sprintf(str, "%f", *(double *)the_constant);
03953       break;
03954 
03955    case Real_16:
03956       sprintf(str, "%Lf", *(long double *)the_constant);
03957       break;
03958 
03959    default:
03960       PRINTMSG(stmt_start_line, 626, Internal, stmt_start_col,
03961                "Integer or Real type", "kludge_output_conversion");
03962       break;
03963    }
03964 }
03965 
03966 # endif 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines