Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
test_ar_intrin.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 #include <stdio.h>
00036 #include <stdlib.h>
00037 #include <ctype.h>
00038 #include <string.h>
00039 
00040 #if defined(_LINUX_LINUX)
00041 # define HAVE_FORTRAN_H
00042 # include <fortran.h>
00043 #endif
00044 
00045 #include "arith.h"
00046 
00047 static int                      pass = 0;
00048 static int                      fail = 0;
00049 
00050 static AR_HOST_SINT64           result[4];
00051 
00052 static void                     check_ar_result();
00053 
00054 static char                     prevfname[8];
00055 static int                      prevflen;
00056 
00057 #if defined(CRAY_TS_IEEE)
00058   static AR_TYPE                INT_TYPE = AR_Int_64_S;
00059   static AR_TYPE                FLOAT_64 = AR_Float_IEEE_NR_64;
00060   static AR_TYPE                FLOAT_128 = AR_Float_IEEE_NR_128;
00061   static AR_TYPE                COMPLEX_64 = AR_Complex_IEEE_NR_64;
00062   static AR_TYPE                COMPLEX_128 = AR_Complex_IEEE_NR_128;
00063 #elif _CRAY
00064   static AR_TYPE                INT_TYPE = AR_Int_64_S;
00065   static AR_TYPE                FLOAT_64 = AR_Float_Cray1_64;
00066   static AR_TYPE                FLOAT_128 = AR_Float_Cray1_128;
00067   static AR_TYPE                COMPLEX_64 = AR_Complex_Cray1_64;
00068   static AR_TYPE                COMPLEX_128 = AR_Complex_Cray1_128;
00069 #else
00070   static AR_TYPE                INT_TYPE = AR_Int_64_S;
00071   static AR_TYPE                FLOAT_64 = AR_Float_IEEE_NR_64;
00072   static AR_TYPE                FLOAT_128 = AR_Float_IEEE_NR_128;
00073   static AR_TYPE                COMPLEX_64 = AR_Complex_IEEE_NR_64;
00074   static AR_TYPE                COMPLEX_128 = AR_Complex_IEEE_NR_128;
00075 #endif
00076 
00077 
00078 int main()
00079 {
00080   prevflen = 0;
00081 
00082 #if !defined(HAVE_FORTRAN_H)
00083   test_native_();
00084 #else
00085   TEST_NATIVE();
00086 #endif
00087   printf("Intrinsic test results:\n%6d passed\n%6d FAILED!!!\n",pass,fail);
00088   exit(fail);
00089   return 0; /* not reached */
00090 }
00091 
00092 #if !defined(HAVE_FORTRAN_H)
00093 void ar_strtod_(answer)
00094 #else
00095 void AR_STRTOD(answer)
00096 #endif
00097      double*    answer;
00098 {
00099   char  num[32];
00100   
00101   double        dval;
00102   
00103   int           ierr;
00104   AR_TYPE       rtype;
00105   
00106   if(*answer >= 1.e6)
00107     sprintf(num,"%22.14e",*answer);
00108   else if(*answer >= 0.)
00109     sprintf(num,"%15.8f",*answer);
00110   else if(*answer >= -1.e6)
00111     sprintf(num,"%15.4f",*answer);
00112   else
00113     sprintf(num,"%25.16e",*answer);
00114   
00115   dval = strtod(num, 0);
00116   
00117   rtype = FLOAT_64;
00118   
00119   ierr = AR_convert_str_to_float((AR_DATA*)&result[0], &rtype, num);
00120   
00121   check_ar_result("STRTOD", strlen("STRTOD"), &result[0], ierr, &dval, 1);
00122 }
00123 
00124 #ifdef LD
00125 #if !defined(HAVE_FORTRAN_H)
00126 void ar_strtold_(answer)
00127 #else
00128 void AR_STRTOLD(answer)
00129 #endif
00130      long double*       answer;
00131 {
00132   char          num[33];
00133   
00134   long double   ldval;
00135 
00136   int                   ierr;
00137   AR_TYPE               rtype;
00138   
00139 #if !defined(HAVE_FORTRAN_H)
00140   if(*answer >= 1.e6L)
00141     sprintf(num,"%30.22Le",*answer);
00142   else if(*answer >= 0.)
00143     sprintf(num,"%20.12Lf",*answer);
00144   else if(*answer >= -1.e6L)
00145     sprintf(num,"%22.10Lf",*answer);
00146   else
00147     sprintf(num,"%31.23Le",*answer);
00148   sscanf(num," %Lf", &ldval);
00149 #else
00150   if(*answer >= 1.e6L)
00151     sprintf(num,"%30.22e",*answer);
00152   else if(*answer >= 0.)
00153     sprintf(num,"%20.12f",*answer);
00154   else if(*answer >= -1.e6L)
00155     sprintf(num,"%22.10f",*answer);
00156   else
00157     sprintf(num,"%31.23e",*answer);
00158   ldval = strtold(num, 0);
00159 #endif
00160   
00161   rtype = FLOAT_128;
00162   
00163   ierr = AR_convert_str_to_float((AR_DATA*)&result[0], &rtype, num);
00164   
00165   check_ar_result("STRTOLD", strlen("STRTOLD"), &result[0], ierr, &ldval, 2);
00166 }
00167 #endif
00168 
00169 
00170 #if !defined(HAVE_FORTRAN_H)
00171 void ar_intrin1_(func, opnd, answer, func_len)
00172      char*                      func;
00173      AR_DATA*                   opnd;
00174      AR_DATA*                   answer;
00175      int                        func_len;
00176 #else
00177 void AR_INTRIN1(func, opnd, answer)
00178      _fcd                       func;
00179      AR_DATA*                   opnd;
00180      AR_DATA*                   answer;
00181 #endif
00182 {
00183   int                           ierr;
00184   int                           n;
00185   AR_TYPE                       rtype,otype,ptype;
00186   
00187 #if !defined(HAVE_FORTRAN_H)
00188   char                  *fname = func;
00189   int                   flen   = func_len;
00190 #else
00191   char                  *fname = _fcdtocp(func);
00192   int                   flen   = _fcdlen(func);
00193 #endif
00194   
00195   n = 1;
00196 
00197   if(strncmp(&fname[flen-3],"LOG",3) == 0) {
00198     if(fname[0] == 'A')
00199       rtype = FLOAT_64;
00200     else if(fname[0] == 'D') {
00201       rtype = FLOAT_128;
00202       n = 2;
00203     }
00204     else if(fname[1] == 'L') {
00205       rtype = COMPLEX_64;
00206       n = 2;
00207     }
00208     else {
00209       rtype = COMPLEX_128;
00210       n = 4;
00211     }
00212     ierr = AR_log((AR_DATA*)&result[0], &rtype, opnd, &rtype);
00213   }
00214   
00215   else if(strncmp(&fname[flen-3],"EXP",3) == 0) {
00216     if(fname[0] == 'E')
00217       rtype = FLOAT_64;
00218     else if(fname[0] == 'D') {
00219       rtype = FLOAT_128;
00220       n = 2;
00221     }
00222     else if(fname[1] == 'E') {
00223       rtype = COMPLEX_64;
00224       n = 2;
00225     }
00226     else {
00227       rtype = COMPLEX_128;
00228       n = 4;
00229     }
00230     ierr = AR_exp((AR_DATA*)&result[0], &rtype, opnd, &rtype);
00231   }
00232   
00233   else if(strncmp(&fname[flen-4],"SQRT",4) == 0) {
00234     if(fname[0] == 'S')
00235       rtype = FLOAT_64;
00236     else if(fname[0] == 'D') {
00237       rtype = FLOAT_128;
00238       n = 2;
00239     }
00240     else if(fname[1] == 'S') {
00241       rtype = COMPLEX_64;
00242       n = 2;
00243     }
00244     else {
00245       rtype = COMPLEX_128;
00246       n = 4;
00247     }
00248     ierr = AR_sqrt((AR_DATA*)&result[0], &rtype, opnd, &rtype);
00249   }
00250   
00251   else if(strncmp(&fname[flen-3],"ABS",3) == 0) {
00252     if(fname[1] == 'A') {
00253       rtype = FLOAT_64;
00254       otype = COMPLEX_64;
00255     }
00256     else {
00257       rtype = FLOAT_128;
00258       otype = COMPLEX_128;
00259       n = 2;
00260     }
00261     ierr = AR_cabs((AR_DATA*)&result[0], &rtype, opnd, &otype);
00262   }
00263   
00264   check_ar_result(fname, flen, &result[0], ierr, answer, n);
00265 }
00266 
00267 #if !defined(HAVE_FORTRAN_H)
00268 void ar_intrin2_(func, opnd1, opnd2, answer, func_len)
00269      char*                      func;
00270      AR_DATA*                   opnd1;
00271      AR_DATA*                   opnd2;
00272      AR_DATA*                   answer;
00273      int                        func_len;
00274 #else
00275      void AR_INTRIN2(func, opnd1, opnd2, answer)
00276      _fcd                       func;
00277      AR_DATA*                   opnd1;
00278      AR_DATA*                   opnd2;
00279      AR_DATA*                   answer;
00280 #endif
00281 {
00282   int                   ierr;
00283   int                   n;
00284   AR_TYPE                       rtype,otype,ptype;
00285   AR_HOST_SINT64        base,power;
00286 
00287 #if !defined(HAVE_FORTRAN_H)
00288   char                  *fname = func;
00289   int                   flen   = func_len;
00290 #else
00291   char                  *fname = _fcdtocp(func);
00292   int                   flen   = _fcdlen(func);
00293 #endif
00294   
00295   n = 1;
00296   
00297   base = power = 0;
00298   if(strncmp(&fname[flen-3],"TOI",3)==0 ||
00299      strncmp(&fname[flen-3],"TOR",3)==0) {
00300     if(fname[0] == 'I') {
00301 #if _CRAY
00302       rtype = AR_Int_64_S;
00303       otype = AR_Int_64_S;
00304 #else
00305       memcpy(((char*)&base)+4, ((char*)opnd1)+4, 4);
00306       memcpy(((char*)&power)+4, ((char*)opnd2)+4, 4);
00307       if((base>>31)  != 0 || (power>>31) != 0) {
00308         if((base>>31)  != 0)
00309           memset((char*)opnd1, 0xff, 4);
00310         if((power>>31) != 0)
00311           memset((char*)opnd2, 0xff, 4);
00312         rtype = AR_Int_64_S;
00313         otype = AR_Int_64_S;
00314       }
00315       else {
00316         rtype = AR_Int_32_S;
00317         otype = AR_Int_32_S;
00318       }
00319 #endif
00320     }
00321     else if(fname[0] == 'R') {
00322       rtype = FLOAT_64;
00323       otype = FLOAT_64;
00324     }
00325     else if(fname[0] == 'D') {
00326       rtype = FLOAT_128;
00327       otype = FLOAT_128;
00328       n = 2;
00329     }
00330     else if(fname[1] == 'T') {
00331       rtype = COMPLEX_64;
00332       otype = COMPLEX_64;
00333       n = 2;
00334     }
00335     else {
00336       rtype = COMPLEX_128;
00337       otype = COMPLEX_128;
00338       n = 4;
00339     }
00340     if(fname[flen-1] == 'I') {
00341 #if _CRAY
00342       ptype = AR_Int_64_S;
00343 #else
00344       memcpy(((char*)&power)+4, ((char*)opnd2)+4, 4);
00345       if(otype == AR_Int_64_S || (power>>31) != 0) {
00346         if((power>>31) != 0)
00347           memset((char*)opnd2, 0xff, 4);
00348         ptype = AR_Int_64_S;
00349       }
00350       else
00351         ptype = AR_Int_32_S;
00352 #endif
00353     }
00354     else
00355       ptype = FLOAT_64;
00356     ierr = AR_power((AR_DATA*)&result[0], &rtype, opnd1, &otype, opnd2,
00357                     &ptype);
00358     if(base != 0) {
00359       memset((char*)opnd1, 0, 4);
00360       if(rtype == AR_Int_64_S && (power&1))
00361         memset((char*)&result[0], 0, 4);
00362     }
00363     if(power != 0)
00364       memset((char*)opnd2, 0, 4);
00365   }
00366   else {
00367     if(fname[0] == 'D') {
00368       rtype = FLOAT_128;
00369       otype = FLOAT_128;
00370       ptype = FLOAT_128;
00371       n = 2;
00372     }
00373     else if(fname[1] == 'T') {
00374       rtype = COMPLEX_64;
00375       otype = COMPLEX_64;
00376       ptype = COMPLEX_64;
00377       n = 2;
00378     }
00379     else {
00380       rtype = COMPLEX_128;
00381       otype = COMPLEX_128;
00382       ptype = COMPLEX_128;
00383       n = 4;
00384     }
00385     ierr = AR_power((AR_DATA*)&result[0], &rtype, opnd1, &otype, opnd2,
00386                     &ptype);
00387   }
00388   
00389   check_ar_result(fname, flen, &result[0], ierr, answer, n);
00390 }
00391 
00392 static
00393 void
00394 check_ar_result(fname, flen, ar_result, ar_error, answer, rsize)
00395      char               *fname;
00396      int                flen;
00397      AR_HOST_SINT64     *ar_result;
00398      int                ar_error;
00399      AR_HOST_SINT64     *answer;
00400      int                rsize;
00401 {
00402   int           i;
00403   int           ierr;
00404   AR_HOST_SINT64        xor;
00405   
00406   if(prevflen != flen && strncmp(prevfname, fname, flen) != 0) {
00407     prevflen = flen;
00408     strncpy(prevfname, fname, flen);
00409     printf("Testing %*.*s intrinsic\n", flen, flen, fname);
00410   }
00411   
00412   ierr = ar_error&(AR_STAT_OVERFLOW|AR_STAT_UNDEFINED|AR_STAT_INVALID_TYPE);
00413   
00414   for(xor=0, i=0; i<rsize; i++)
00415     xor |= (ar_result[i]^answer[i]);
00416   
00417   if((ierr & (AR_STAT_OVERFLOW|AR_STAT_UNDEFINED)) &&
00418      ((answer[0]>>52)&0x7ff) == 0x7ff) ierr=0;
00419   
00420   if(ierr!=0 || xor!=0) {
00421     const char* conversion = NULL;
00422 
00423     fprintf(stderr,
00424             "\n***** ERROR *** ERROR *** ERROR *** ERROR *****\n");
00425     fprintf(stderr,
00426             "   arith.a %*.*s result does not match expected result of",
00427             flen, flen, fname);
00428     
00429 #ifdef _CRAY /* see arith.h */
00430     conversion = " %8.8lx";
00431 #else
00432     conversion = " %8.8llx";
00433 #endif
00434       
00435     for(i=0; i<rsize; i++)
00436       fprintf(stderr, conversion, (AR_HOST_UINT64)answer[i]);
00437     fprintf(stderr,"\n");
00438     if(ierr != 0)
00439       fprintf(stderr,
00440               "   The arith.a routine returned an error code = 0%o\n",
00441               ierr);
00442     else {
00443       fprintf(stderr,"   The arith.a routine returned a result of");
00444       for(i=0; i<rsize; i++)
00445         fprintf(stderr, conversion, (AR_HOST_UINT64)ar_result[i]);
00446       fprintf(stderr,"\n");
00447     }
00448     fail++;
00449   }
00450   else
00451     pass++;
00452   
00453 }
00454 
00455 
00456 static char USMID [] = "\n%Z%%M%        %I%     %G% %U%\n";
00457 static char rcsid [] = "$Id: test_ar_intrin.c,v 1.4 2003-12-11 22:08:33 eraxxon Exp $";
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines