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