00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <stdio.h>
00036 #include <ctype.h>
00037
00038 #include "arith.h"
00039
00040 main() {
00041 AR_HOST_SINT64 ans[4];
00042 AR_HOST_SINT64 arg[8];
00043 AR_HOST_SINT64 result[4];
00044
00045 AR_TYPE rtype,opndtype,ptype;
00046
00047 char line[256];
00048 char prevfunc[9];
00049 char func[9];
00050 char* linep;
00051 char* num;
00052
00053 int i,l,n;
00054 int ierr;
00055 int pass,okerrs,fail;
00056 int rsize;
00057
00058 AR_HOST_SINT64 xor;
00059
00060 FILE *file;
00061
00062 pass=okerrs=fail=0;
00063
00064 file = fopen("results/tsieee_sim_data","r");
00065 if(file == NULL) {
00066 fprintf(stderr, "Could not open results/tsieee_sim_data\n");
00067 exit(0);
00068 }
00069
00070 prevfunc[0]=0;
00071 while(fgets(line,256,file) != NULL) {
00072 i=l=0;
00073 while(line[l] != '(')
00074 func[i++]=line[l++];
00075 func[i]=0;
00076 if(strcmp(func,"STOP") == 0) exit(0);
00077 if(strcmp(func,prevfunc)) {
00078 printf("Testing %s intrinsic\n",func);
00079 strcpy(prevfunc,func);
00080 }
00081 l++;
00082 num=NULL;
00083 if(func[0]=='C') {
00084 if(func[1]=='X')
00085 rsize=4;
00086 else if(strcmp(func,"COS")!=0 && strcmp(func,"COSH")!=0)
00087 rsize=2;
00088 else
00089 rsize=1;
00090 }
00091 else if(func[0]=='X' && func[1] == 'D')
00092 rsize=2;
00093 else if(strcmp(func,"STRTOD") == 0) {
00094 rsize=1;
00095 num=line+l;
00096 }
00097 else if(strcmp(func,"STRTOF") == 0) {
00098 rsize=1;
00099 num=line+l;
00100 }
00101 else if(strcmp(func,"STRTOLD") == 0) {
00102 rsize=2;
00103 num=line+l;
00104 }
00105 else if(strcmp(func,"STRTOXD") == 0) {
00106 rsize=2;
00107 num=line+l;
00108 }
00109 else
00110 rsize=1;
00111 n=0;
00112 while(line[l] != ')') {
00113 if(num == NULL) {
00114 if(line[l]=='C') {
00115 if(line[++l]=='X') {
00116 n+=4; l++;
00117 if(line[l]=='D') l++;
00118 }
00119 else
00120 n+=2;
00121 }
00122 else if(line[l++]=='X') {
00123 if(line[l]=='D')
00124 { n+=2; l++; }
00125 else
00126 n+=1;
00127 }
00128 else
00129 n+=1;
00130 if(line[l]==',')
00131 l++;
00132 else if(line[l]!=')') {
00133 fprintf(stderr,"Invalid input on line:\n %s\n",line);
00134 n=0;
00135 break;
00136 }
00137 }
00138 else {
00139 n=1;
00140 if(line[l] == 'D') line[l] = 'E';
00141 l++;
00142 }
00143 }
00144 if(n == 0) continue;
00145 linep=&line[++l];
00146 if(num == NULL) {
00147 for(i=0;i<n;i++)
00148 get_hex_input(&linep, &arg[i]);
00149 }
00150 else {
00151 if(line[l-2] == '"')
00152 line[l-2] = 0;
00153 else
00154 line[l-1] = 0;
00155 if(num[0] == '"') num++;
00156 memcpy((char*)(&arg[0])+8-sizeof(char*), &num, sizeof(char*));
00157 }
00158 for(i=0;i<rsize;i++)
00159 get_hex_input(&linep, &ans[i]);
00160 l = strlen(func);
00161 if(strncmp(func,"STRTO",5) == 0) {
00162 if(func[5] == 'D')
00163 rtype = AR_Float_IEEE_NR_64;
00164 else if(func[5] == 'X')
00165 rtype = AR_Float_IEEE_NR_128;
00166 else
00167 rtype = AR_Float_IEEE_NR_32;
00168 ierr=AR_convert_str_to_float((AR_DATA*)&result[0], &rtype, num);
00169 num[strlen(num)] = ')';
00170 }
00171 else if(strncmp(&func[l-3],"LOG",3) == 0) {
00172 if(func[0] == 'A')
00173 rtype = AR_Float_IEEE_NR_64;
00174 else if(func[0] == 'D')
00175 rtype = AR_Float_IEEE_NR_128;
00176 else if(func[0] == 'X')
00177 rtype = AR_Float_IEEE_NR_128;
00178 else if(func[1] == 'L')
00179 rtype = AR_Complex_IEEE_NR_64;
00180 else
00181 rtype = AR_Complex_IEEE_NR_128;
00182 ierr = AR_log((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &rtype);
00183 }
00184 else if(strncmp(&func[l-3],"EXP",3) == 0) {
00185 if(func[0] == 'E')
00186 rtype = AR_Float_IEEE_NR_64;
00187 else if(func[0] == 'D')
00188 rtype = AR_Float_IEEE_NR_128;
00189 else if(func[0] == 'X')
00190 rtype = AR_Float_IEEE_NR_128;
00191 else if(func[1] == 'E')
00192 rtype = AR_Complex_IEEE_NR_64;
00193 else
00194 rtype = AR_Complex_IEEE_NR_128;
00195 ierr = AR_exp((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &rtype);
00196 }
00197 else if(strncmp(&func[l-4],"SQRT",4) == 0) {
00198 if(func[0] == 'S')
00199 rtype = AR_Float_IEEE_NR_64;
00200 else if(func[0] == 'D')
00201 rtype = AR_Float_IEEE_NR_128;
00202 else if(func[0] == 'X')
00203 rtype = AR_Float_IEEE_NR_128;
00204 else if(func[1] == 'S')
00205 rtype = AR_Complex_IEEE_NR_64;
00206 else
00207 rtype = AR_Complex_IEEE_NR_128;
00208 ierr = AR_sqrt((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &rtype);
00209 }
00210 else if(strncmp(&func[l-3],"ABS",3) == 0) {
00211 if(func[1] == 'A') {
00212 rtype = AR_Float_IEEE_NR_64;
00213 opndtype = AR_Complex_IEEE_NR_64;
00214 }
00215 else {
00216 rtype = AR_Float_IEEE_NR_128;
00217 opndtype = AR_Complex_IEEE_NR_128;
00218 }
00219 rsize >>= 1;
00220 ierr = AR_cabs((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &opndtype);
00221 }
00222 else if(strncmp(&func[l-3],"TOI",3)==0 ||
00223 strncmp(&func[l-3],"TOD",3)==0) {
00224 if(func[0] == 'I') {
00225 rtype = AR_Int_64_S;
00226 opndtype = AR_Int_64_S;
00227 }
00228 else if(func[0] == 'D') {
00229 rtype = AR_Float_IEEE_NR_64;
00230 opndtype = AR_Float_IEEE_NR_64;
00231 }
00232 else if(func[0] == 'X') {
00233 rtype = AR_Float_IEEE_NR_128;
00234 opndtype = AR_Float_IEEE_NR_128;
00235 }
00236 else if(func[1] == 'T') {
00237 rtype = AR_Complex_IEEE_NR_64;
00238 opndtype = AR_Complex_IEEE_NR_64;
00239 }
00240 else {
00241 rtype = AR_Complex_IEEE_NR_128;
00242 opndtype = AR_Complex_IEEE_NR_128;
00243 }
00244 if(func[l-1] == 'I')
00245 ptype = AR_Int_64_S;
00246 else if(func[l-1] == 'D')
00247 ptype = AR_Float_IEEE_NR_64;
00248 else
00249 ptype = AR_Float_IEEE_NR_128;
00250 ierr = AR_power((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &opndtype, (AR_DATA*)&arg[n-1], &ptype);
00251 }
00252 else if(strncmp(&func[0],"MODULO",6)==0 ) {
00253 if(func[6] == 'I') {
00254 rtype = AR_Int_46_S;
00255 if(arg[0] & 0x80000000)
00256 arg[0] |= ((AR_HOST_SINT64)0xffffffff)<<32;
00257 if(arg[1] & 0x80000000)
00258 arg[1] |= ((AR_HOST_SINT64)0xffffffff)<<32;
00259 }
00260 else if(func[6] == 'J')
00261 rtype = AR_Int_64_S;
00262 else if(func[6] == 'F')
00263 rtype = AR_Float_IEEE_NR_32;
00264 else if(func[6] == 'S')
00265 rtype = AR_Float_IEEE_NR_64;
00266 else if(func[6] == 'D')
00267 rtype = AR_Float_IEEE_NR_128;
00268 ierr = AR_Modulo((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &rtype, (AR_DATA*)&arg[n>>1], &rtype);
00269 }
00270 else if(strncmp(&func[0],"SELREALK",8)==0 ) {
00271 rtype = AR_Int_64_S;
00272 if(arg[0] < 0 && arg[1] < 0)
00273 ierr = AR_selected_real_kind((AR_DATA*)&result[0], &rtype, (AR_DATA*)NULL, &rtype, (AR_DATA*)NULL, &rtype);
00274 else if(arg[0] < 0)
00275 ierr = AR_selected_real_kind((AR_DATA*)&result[0], &rtype, (AR_DATA*)NULL, &rtype, (AR_DATA*)&arg[1], &rtype);
00276 else if(arg[1] < 0)
00277 ierr = AR_selected_real_kind((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &rtype, (AR_DATA*)NULL, &rtype);
00278 else
00279 ierr = AR_selected_real_kind((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &rtype, (AR_DATA*)&arg[1], &rtype);
00280 }
00281 else {
00282 if(func[0] == 'D') {
00283 rtype = AR_Float_IEEE_NR_64;
00284 opndtype = AR_Float_IEEE_NR_64;
00285 ptype = AR_Float_IEEE_NR_64;
00286 }
00287 else if(func[1] == 'T') {
00288 rtype = AR_Complex_IEEE_NR_64;
00289 opndtype = AR_Complex_IEEE_NR_64;
00290 ptype = AR_Complex_IEEE_NR_64;
00291 }
00292 else if(func[0] == 'X' && func[1] == 'D') {
00293 rtype = AR_Float_IEEE_NR_128;
00294 opndtype = AR_Float_IEEE_NR_128;
00295 ptype = AR_Float_IEEE_NR_128;
00296 }
00297 else {
00298 rtype = AR_Complex_IEEE_NR_128;
00299 opndtype = AR_Complex_IEEE_NR_128;
00300 ptype = AR_Complex_IEEE_NR_128;
00301 }
00302 ierr = AR_power((AR_DATA*)&result[0], &rtype, (AR_DATA*)&arg[0], &opndtype, (AR_DATA*)&arg[n>>1], &ptype);
00303 }
00304 ierr &= (AR_STAT_OVERFLOW|AR_STAT_UNDERFLOW|AR_STAT_UNDEFINED|AR_STAT_INVALID_TYPE);
00305 if(rsize > 1 && ((result[0]>>52)&0x7ff) == 0x7ff)
00306 xor = result[0]^ans[0];
00307 else
00308 for(xor=0, i=0; i<rsize; i++)
00309 xor |= (result[i]^ans[i]);
00310 if(ierr!=0 || xor!=0) {
00311 if(ierr!=0 && ans[0]==ierr)
00312 okerrs++;
00313 else {
00314 fprintf(stderr,"\n***** ERROR *** ERROR *** ERROR *** ERROR *****\n");
00315 fprintf(stderr," Intrinsic result does not match expected result on input line:\n %s\n",line);
00316 if(ierr != 0)
00317 fprintf(stderr," The intrinsic returned an error code = 0%o\n",ierr);
00318 else {
00319 fprintf(stderr," The intrinsic returned a result of:\n ");
00320 for(i=0; i<rsize; i++)
00321 fprintf(stderr," %16.16llx",result[i]);
00322 fprintf(stderr,"\n");
00323 }
00324 fail++;
00325 }
00326 }
00327 else
00328 pass++;
00329 }
00330
00331 printf("Intrinsic test results:\n%6d passed\n%6d passed with expected error condition\n%6d FAILED!!!\n",pass,okerrs,fail);
00332 exit(fail);
00333
00334 }
00335
00336 get_hex_input(str, arg)
00337 char** str;
00338 AR_HOST_SINT64 *arg;
00339 {
00340 char* line;
00341
00342 int h1,h2,h3,h4;
00343
00344 line = *str;
00345
00346 while(!isxdigit(*line)) line++;
00347
00348 h1=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00349 h2=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00350 h3=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00351 h4=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00352 (*arg) = (AR_HOST_SINT64)((h1<<12) | (h2<<8) | (h3<<4) | h4)<<16;
00353
00354 h1=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00355 h2=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00356 h3=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00357 h4=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00358 (*arg) |= (AR_HOST_SINT64)((h1<<12) | (h2<<8) | (h3<<4) | h4);
00359
00360 if(isxdigit(*line)) {
00361 (*arg) <<= 32;
00362
00363 h1=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00364 h2=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00365 h3=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00366 h4=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00367 (*arg) |= (AR_HOST_SINT64)((h1<<12) | (h2<<8) | (h3<<4) | h4)<<16;
00368
00369 h1=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00370 h2=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00371 h3=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00372 h4=(*line>='A')?*line-'A'+10:*line-'0'; line++;
00373 (*arg) |= (AR_HOST_SINT64)((h1<<12) | (h2<<8) | (h3<<4) | h4);
00374 }
00375
00376 *str = line;
00377 }
00378
00379
00380 static char USMID [] = "\n%Z%%M% %I% %G% %U%\n";
00381 static char rcsid [] = "$Id: test_tsieee_sim.c,v 1.1.1.1 2002-05-22 20:06:19 dsystem Exp $";