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
00036
00037
00038 #include "arith.internal.h"
00039
00040
00041 int
00042 ar_convert_to_integral
00043 (ar_data *result, const AR_TYPE *resulttype,
00044 const ar_data *opnd, const AR_TYPE *opndtype) {
00045
00046 int status = AR_STAT_OK;
00047 int maxnegint;
00048 int rsltsz, opndsz;
00049
00050 if (AR_CLASS (*opndtype) == AR_CLASS_FLOAT) {
00051 switch (*opndtype) {
00052 case AR_Float_Cray1_64:
00053 case AR_Float_Cray1_64_F:
00054 status = ar_cfix64 (&result->ar_i64, &opnd->ar_f64, 64);
00055 break;
00056 case AR_Float_Cray1_128:
00057 status = ar_cfix128 (&result->ar_i64,
00058 &opnd->ar_f128, 64);
00059 break;
00060 case AR_Float_IEEE_NR_32:
00061 case AR_Float_IEEE_ZE_32:
00062 case AR_Float_IEEE_UP_32:
00063 case AR_Float_IEEE_DN_32:
00064 status = ar_ifix32 (&result->ar_i64, &opnd->ar_ieee32,
00065 64, ROUND_MODE (*opndtype));
00066 break;
00067 case AR_Float_IEEE_NR_64:
00068 case AR_Float_IEEE_ZE_64:
00069 case AR_Float_IEEE_UP_64:
00070 case AR_Float_IEEE_DN_64:
00071 status = ar_ifix64 (&result->ar_i64, &opnd->ar_ieee64,
00072 64, ROUND_MODE (*opndtype));
00073 break;
00074 case AR_Float_IEEE_NR_128:
00075 case AR_Float_IEEE_ZE_128:
00076 case AR_Float_IEEE_UP_128:
00077 case AR_Float_IEEE_DN_128:
00078 status = ar_ifix128 (&result->ar_i64, &opnd->ar_ieee128,
00079 64, ROUND_MODE (*opndtype));
00080 break;
00081 case AR_Complex_Cray1_64:
00082 case AR_Complex_Cray1_64_F:
00083 status = ar_cfix64 (&result->ar_i64,
00084 &opnd->ar_cplx_f64.real, 64);
00085 break;
00086 case AR_Complex_Cray1_128:
00087 status = ar_cfix128 (&result->ar_i64,
00088 &opnd->ar_cplx_f128.real, 64);
00089 break;
00090 case AR_Complex_IEEE_NR_32:
00091 case AR_Complex_IEEE_ZE_32:
00092 case AR_Complex_IEEE_UP_32:
00093 case AR_Complex_IEEE_DN_32:
00094 {
00095 AR_IEEE_32 realpart;
00096
00097 CPLX32_REAL_TO_IEEE32(realpart, opnd->ar_cplx_ieee32);
00098 status = ar_ifix32 (&result->ar_i64, &realpart,
00099 64, ROUND_MODE (*opndtype));
00100 break;
00101 }
00102 case AR_Complex_IEEE_NR_64:
00103 case AR_Complex_IEEE_ZE_64:
00104 case AR_Complex_IEEE_UP_64:
00105 case AR_Complex_IEEE_DN_64:
00106 status = ar_ifix64 (&result->ar_i64,
00107 &opnd->ar_cplx_ieee64.real,
00108 64, ROUND_MODE (*opndtype));
00109 break;
00110 case AR_Complex_IEEE_NR_128:
00111 case AR_Complex_IEEE_ZE_128:
00112 case AR_Complex_IEEE_UP_128:
00113 case AR_Complex_IEEE_DN_128:
00114 status = ar_ifix128(&result->ar_i64,
00115 &opnd->ar_cplx_ieee128.real,
00116 64, ROUND_MODE (*opndtype));
00117 break;
00118
00119 default:
00120 return AR_STAT_INVALID_TYPE;
00121 }
00122
00123 }
00124
00125 else if (AR_CLASS (*opndtype) == AR_CLASS_POINTER) {
00126 result->ar_i64 = opnd->ar_i64;
00127 }
00128
00129 else if (AR_CLASS (*opndtype) == AR_CLASS_INT) {
00130 result->ar_i64 = opnd->ar_i64;
00131 opndsz = AR_INT_SIZE(*opndtype);
00132 if(opndsz == AR_INT_SIZE_46) opndsz = AR_INT_SIZE_64;
00133 rsltsz = AR_INT_SIZE(*resulttype);
00134 if(rsltsz == AR_INT_SIZE_46) rsltsz = AR_INT_SIZE_64;
00135
00136 if (AR_SIGNEDNESS (*opndtype) == AR_SIGNED) {
00137
00138 if (opndsz == AR_INT_SIZE_8 && INT8_SIGN(opnd)) {
00139
00140 maxnegint = IS_INT8_UPPER_ZERO(opnd) &&
00141 (opnd->ar_i8.part5 == 0x80);
00142 result->ar_i8.part1 = 0xFFFF;
00143 result->ar_i8.part2 = 0xFFFF;
00144 result->ar_i8.part3 = 0xFFFF;
00145 result->ar_i8.part4 = 0xFF;
00146 }
00147 else if (opndsz == AR_INT_SIZE_16 && INT16_SIGN(opnd)) {
00148 maxnegint = IS_INT16_UPPER_ZERO(opnd) &&
00149 (opnd->ar_i64.part4 == 0x8000);
00150
00151 result->ar_i64.part1 = 0xFFFF;
00152 result->ar_i64.part2 = 0xFFFF;
00153 result->ar_i64.part3 = 0xFFFF;
00154 }
00155 else if (opndsz == AR_INT_SIZE_24 && INT24_SIGN(opnd)) {
00156 maxnegint = IS_INT24_UPPER_ZERO(opnd) &&
00157 (opnd->ar_i64.part3 == 0x80) &&
00158 (opnd->ar_i64.part4 == 0x0);
00159
00160 result->ar_i64.part1 = 0xFFFF;
00161 result->ar_i64.part2 = 0xFFFF;
00162 result->ar_i64.part3 |= 0xFF00;
00163 }
00164 else if (opndsz == AR_INT_SIZE_32 && INT32_SIGN(opnd)) {
00165 maxnegint = IS_INT32_UPPER_ZERO(opnd) &&
00166 (opnd->ar_i64.part3 == 0x8000) &&
00167 (opnd->ar_i64.part4 == 0);
00168
00169 result->ar_i64.part1 = 0xFFFF;
00170 result->ar_i64.part2 = 0xFFFF;
00171 }
00172 else
00173 maxnegint = (opnd->ar_i64.part1 == 0x8000) &&
00174 (opnd->ar_i64.part2 == 0) &&
00175 (opnd->ar_i64.part3 == 0) &&
00176 (opnd->ar_i64.part4 == 0);
00177
00178 if ((result->ar_i64.part1 & 0x8000) &&
00179 (AR_SIGNEDNESS (*resulttype) == AR_UNSIGNED)) {
00180
00181
00182 if(opndsz == rsltsz)
00183 status |= AR_STAT_SEMIVALID;
00184 if(opndsz != rsltsz || !maxnegint)
00185 status |= AR_STAT_OVERFLOW;
00186 }
00187 }
00188 else if (AR_SIGNEDNESS(*resulttype) == AR_SIGNED && rsltsz == opndsz) {
00189
00190 switch (AR_INT_SIZE (*opndtype)) {
00191 case AR_INT_SIZE_8:
00192 if (INT8_SIGN(opnd)) {
00193 status |= AR_STAT_SEMIVALID;
00194 if(opnd->ar_i8.part5 != 0x80)
00195 status |= AR_STAT_OVERFLOW;
00196 }
00197 break;
00198
00199 case AR_INT_SIZE_16:
00200 if (INT16_SIGN(opnd)) {
00201 status |= AR_STAT_SEMIVALID;
00202 if(opnd->ar_i64.part4 != 0x8000)
00203 status |= AR_STAT_OVERFLOW;
00204 }
00205 break;
00206
00207 case AR_INT_SIZE_24:
00208 if (INT24_SIGN(opnd)) {
00209 status |= AR_STAT_SEMIVALID;
00210 if(opnd->ar_i64.part3 != 0x80 ||
00211 opnd->ar_i64.part4 != 0)
00212 status |= AR_STAT_OVERFLOW;
00213 }
00214 break;
00215
00216 case AR_INT_SIZE_32:
00217 if (INT32_SIGN(opnd)) {
00218 status |= AR_STAT_SEMIVALID;
00219 if(opnd->ar_i64.part3 != 0x8000 ||
00220 opnd->ar_i64.part4 != 0)
00221 status |= AR_STAT_OVERFLOW;
00222 }
00223 break;
00224
00225 case AR_INT_SIZE_46:
00226 case AR_INT_SIZE_64:
00227 if(INT64_SIGN(opnd)) {
00228 status |= AR_STAT_SEMIVALID;
00229 if(opnd->ar_i64.part1 != 0x8000 ||
00230 opnd->ar_i64.part2 != 0 ||
00231 opnd->ar_i64.part3 != 0 ||
00232 opnd->ar_i64.part4 != 0)
00233 status |= AR_STAT_OVERFLOW;
00234 }
00235 break;
00236
00237 default:
00238 return (AR_STAT_INVALID_TYPE);
00239 }
00240
00241 if(status & (AR_STAT_SEMIVALID | AR_STAT_OVERFLOW))
00242 status |= AR_STAT_NEGATIVE;
00243 }
00244 else {
00245
00246 if (INT64_SIGN(result) &&
00247 (AR_SIGNEDNESS(*resulttype) == AR_SIGNED)) {
00248
00249 status |= AR_STAT_OVERFLOW;
00250 }
00251 }
00252 }
00253 else
00254 return AR_STAT_INVALID_TYPE;
00255
00256
00257
00258
00259 if(!(status & AR_STAT_SEMIVALID))
00260 switch (*resulttype) {
00261 case AR_Int_8_S:
00262 if (!(result->ar_i8.part1 == 0xffff &&
00263 result->ar_i8.part2 == 0xffff &&
00264 result->ar_i8.part3 == 0xffff &&
00265 result->ar_i8.part4 == 0xff &&
00266 INT8_SIGN(result) == 0x80)&&
00267 !(IS_INT8_UPPER_ZERO(result) &&
00268 INT8_SIGN(result) == 0)) {
00269 status |= AR_STAT_OVERFLOW;
00270 }
00271 if (INT8_SIGN(result))
00272 status |= AR_STAT_NEGATIVE;
00273 break;
00274
00275 case AR_Int_8_U:
00276 if (!IS_INT8_UPPER_ZERO(result)) {
00277 status |= AR_STAT_OVERFLOW;
00278 }
00279 break;
00280
00281 case AR_Int_16_S:
00282 if (!(result->ar_i64.part1 == 0xffff &&
00283 result->ar_i64.part2 == 0xffff &&
00284 result->ar_i64.part3 == 0xffff &&
00285 INT16_SIGN(result) == 0x8000)&&
00286 !(IS_INT16_UPPER_ZERO(result) &&
00287 INT16_SIGN(result) == 0)) {
00288 status |= AR_STAT_OVERFLOW;
00289 }
00290 if (INT16_SIGN(result))
00291 status |= AR_STAT_NEGATIVE;
00292 break;
00293
00294 case AR_Int_16_U:
00295 if (!IS_INT16_UPPER_ZERO(result)) {
00296 status |= AR_STAT_OVERFLOW;
00297 }
00298 break;
00299
00300 case AR_Int_24_S:
00301 if (!(result->ar_i64.part1 == 0xffff &&
00302 result->ar_i64.part2 == 0xffff &&
00303 (result->ar_i64.part3&0xff00) == 0xff00 &&
00304 INT24_SIGN(result) == 0x0080)&&
00305 !(IS_INT24_UPPER_ZERO(result) &&
00306 INT24_SIGN(result) == 0)) {
00307 status |= AR_STAT_OVERFLOW;
00308 }
00309 if (INT24_SIGN(result))
00310 status |= AR_STAT_NEGATIVE;
00311 break;
00312
00313 case AR_Int_24_U:
00314 if (!IS_INT24_UPPER_ZERO(result)) {
00315 status |= AR_STAT_OVERFLOW;
00316 }
00317 break;
00318
00319 case AR_Int_32_S:
00320 if (!(result->ar_i64.part1 == 0xffff &&
00321 result->ar_i64.part2 == 0xffff &&
00322 INT32_SIGN(result) == 0x8000)&&
00323 !(IS_INT32_UPPER_ZERO(result) &&
00324 INT32_SIGN(result) == 0)) {
00325 status |= AR_STAT_OVERFLOW;
00326 }
00327 if (INT32_SIGN(result))
00328 status |= AR_STAT_NEGATIVE;
00329
00330 break;
00331
00332 case AR_Int_32_U:
00333 if (!IS_INT32_UPPER_ZERO(result)) {
00334 status |= AR_STAT_OVERFLOW;
00335 }
00336 break;
00337
00338 case AR_Int_46_S:
00339 if (INT_OVERFLOWS_46_BITS(*result))
00340 status |= AR_STAT_OVERFLOW;
00341 if (INT64_SIGN(result))
00342 status |= AR_STAT_NEGATIVE;
00343 break;
00344
00345 case AR_Int_64_S:
00346 if (INT64_SIGN(result))
00347 status |= AR_STAT_NEGATIVE;
00348 break;
00349 }
00350
00351 ar_clear_unused_bits(result, resulttype);
00352
00353 if (IS_INT64_ZERO(result))
00354 status |= AR_STAT_ZERO;
00355
00356 return status;
00357 }
00358
00359 static
00360 int
00361 ar_convert_to_pointer
00362 (ar_data *result, const AR_TYPE *resulttype,
00363 const ar_data *opnd, const AR_TYPE *opndtype) {
00364
00365 AR_TYPE unsigned_word_type = AR_Int_64_U;
00366
00367
00368 if (AR_CLASS (*opndtype) == AR_CLASS_INT)
00369
00370
00371 if (AR_POINTER_FORMAT (*resulttype) != AR_POINTER_WORD) {
00372 ar_convert_to_integral (result, &unsigned_word_type,
00373 opnd, opndtype);
00374 }
00375 else {
00376 result->ar_i64 = opnd->ar_i64;
00377 }
00378
00379 else if (AR_CLASS (*opndtype) == AR_CLASS_POINTER) {
00380
00381 result->ar_i64 = opnd->ar_i64;
00382 if (*resulttype == *opndtype)
00383 return AR_STAT_OK;
00384
00385
00386 if (*resulttype == AR_Pointer_Byte ||
00387 *opndtype == AR_Pointer_Byte)
00388 return AR_STAT_INVALID_TYPE;
00389
00390 if (AR_POINTER_FORMAT (*resulttype) == AR_POINTER_WORD) {
00391 if (AR_POINTER_FORMAT (*opndtype) == AR_POINTER_FCTN) {
00392
00393 ar_dblshift(result, &unsigned_word_type,
00394 (const ar_data*)&AR_const_zero, result, 2);
00395 }
00396
00397 } else if (AR_POINTER_FORMAT (*resulttype) == AR_POINTER_FCTN) {
00398 if (AR_POINTER_FORMAT (*opndtype) == AR_POINTER_WORD) {
00399
00400 ar_dblshift(result, &unsigned_word_type,
00401 (const ar_data*)&AR_const_zero, result, 126);
00402 }
00403 }
00404 } else
00405 return AR_STAT_INVALID_TYPE;
00406
00407 ar_clear_unused_bits (result, resulttype);
00408 return AR_STAT_OK;
00409 }
00410
00411 int
00412 ar_convert_to_float
00413 (ar_data *result, const AR_TYPE *resulttype,
00414 const ar_data *opnd, const AR_TYPE *opndtype) {
00415
00416 ar_data re, im, sint64;
00417 AR_TYPE reimtype, sint64type = AR_Int_64_S;
00418 int status = AR_STAT_OK;
00419
00420 if (AR_CLASS (*opndtype) == AR_CLASS_FLOAT) {
00421
00422 if (AR_FLOAT_IS_COMPLEX (*opndtype) == AR_FLOAT_COMPLEX)
00423 status |= ar_decompose_complex (&re, &im, &reimtype,
00424 opnd, opndtype);
00425 else {
00426 re = *opnd;
00427 reimtype = *opndtype;
00428 }
00429
00430 if (AR_FLOAT_FORMAT (*resulttype) == AR_FLOAT_CRAY)
00431 if (AR_FLOAT_SIZE (*resulttype) == AR_FLOAT_64)
00432 if (AR_FLOAT_FORMAT (reimtype) == AR_FLOAT_IEEE)
00433 if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_64)
00434 status |= ar_itoc64 (&result->ar_f64, &re.ar_ieee64, AR_ROUND_NEAREST);
00435 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_32) {
00436 status |= ar_i32to64 (&im.ar_ieee64, &re.ar_ieee32);
00437 status |= ar_itoc64 (&result->ar_f64, &im.ar_ieee64, AR_ROUND_NEAREST);
00438 } else
00439 return AR_STAT_INVALID_TYPE;
00440 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_64) {
00441 result->ar_f64 = re.ar_f64;
00442 status = AR_status ((AR_DATA*)result, resulttype);
00443 } else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128)
00444 status |= ar_c128to64 (&result->ar_f64,
00445 &re.ar_f128);
00446 else
00447 return AR_STAT_INVALID_TYPE;
00448 else if (AR_FLOAT_SIZE (*resulttype) == AR_FLOAT_128)
00449 if (AR_FLOAT_FORMAT (reimtype) == AR_FLOAT_IEEE)
00450 if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_64)
00451 status |= ar_i64toc128 (&result->ar_f128, &re.ar_ieee64);
00452 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_32) {
00453 status |= ar_i32to64 (&im.ar_ieee64, &re.ar_ieee32);
00454 status |= ar_i64toc128 (&result->ar_f128, &im.ar_ieee64);
00455 } else
00456 return AR_STAT_INVALID_TYPE;
00457 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128) {
00458 result->ar_f128 = re.ar_f128;
00459 status = AR_status ((AR_DATA*)result, resulttype);
00460 } else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_64)
00461 status |= ar_c64to128 (&result->ar_f128,
00462 &re.ar_f64);
00463 else
00464 return AR_STAT_INVALID_TYPE;
00465 else
00466 return AR_STAT_INVALID_TYPE;
00467
00468 else {
00469
00470 if (AR_FLOAT_SIZE (*resulttype) == AR_FLOAT_32) {
00471 if (AR_FLOAT_FORMAT (reimtype) == AR_FLOAT_IEEE) {
00472 if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_32) {
00473 result->ar_ieee32 = re.ar_ieee32;
00474 status |= AR_status ((AR_DATA*)result, resulttype);
00475 } else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_64)
00476 status |= ar_i64to32 (&result->ar_ieee32, &re.ar_ieee64, AR_ROUND_NEAREST);
00477 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128) {
00478 status |= ar_i128to64 (&im.ar_ieee64, &re.ar_ieee128, AR_ROUND_NEAREST);
00479 status |= ar_i64to32 (&result->ar_ieee32, &im.ar_ieee64, AR_ROUND_NEAREST);
00480 }
00481 else
00482 return AR_STAT_INVALID_TYPE;
00483 }
00484 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128) {
00485 status |= ar_c128toi64 (&im.ar_ieee64, &re.ar_f128);
00486 status |= ar_i64to32 (&result->ar_ieee32, &im.ar_ieee64, AR_ROUND_NEAREST);
00487 } else {
00488 status |= ar_ctoi64 (&im.ar_ieee64, &re.ar_f64);
00489 status |= ar_i64to32 (&result->ar_ieee32, &im.ar_ieee64, AR_ROUND_NEAREST);
00490 }
00491 }
00492 else if (AR_FLOAT_SIZE (*resulttype) == AR_FLOAT_64) {
00493 if (AR_FLOAT_FORMAT (reimtype) == AR_FLOAT_IEEE) {
00494 if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_32)
00495 status |= ar_i32to64 (&result->ar_ieee64, &re.ar_ieee32);
00496 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_64) {
00497 result->ar_ieee64 = re.ar_ieee64;
00498 return AR_status ((AR_DATA*)result, resulttype);
00499 }
00500 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128)
00501 status |= ar_i128to64 (&result->ar_ieee64, &re.ar_ieee128, AR_ROUND_NEAREST);
00502 else
00503 return AR_STAT_INVALID_TYPE;
00504 }
00505 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128) {
00506 status |= ar_ctoi128 (&im.ar_ieee128, &re.ar_f128);
00507 status |= ar_i128to64 (&result->ar_ieee64, &im.ar_ieee128, AR_ROUND_NEAREST);
00508 }
00509 else {
00510 status |= ar_ctoi64 (&result->ar_ieee64, &re.ar_f64);
00511 }
00512 }
00513
00514 else if (AR_FLOAT_SIZE (*resulttype) == AR_FLOAT_128) {
00515 if (AR_FLOAT_FORMAT (reimtype) == AR_FLOAT_IEEE) {
00516 if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_32) {
00517 status |= ar_i32to64 (&im.ar_ieee64, &re.ar_ieee32);
00518 status |= ar_i64to128 (&result->ar_ieee128, &im.ar_ieee64);
00519 }
00520 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_64)
00521 status |= ar_i64to128 (&result->ar_ieee128, &re.ar_ieee64);
00522 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128) {
00523 result->ar_ieee128 = re.ar_ieee128;
00524 return AR_status ((AR_DATA*)result, resulttype);
00525 }
00526 else
00527 return AR_STAT_INVALID_TYPE;
00528 }
00529 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128)
00530 status |= ar_ctoi128 (&result->ar_ieee128, &re.ar_f128);
00531 else {
00532 status |= ar_ctoi64 (&im.ar_ieee64, &re.ar_f64);
00533 status |= ar_i64to128(&result->ar_ieee128, &im.ar_ieee64);
00534 }
00535 }
00536
00537 else if (AR_FLOAT_FORMAT (reimtype) == AR_FLOAT_CRAY)
00538 if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_128)
00539 status |= ar_c128toi64 (&result->ar_ieee64, &re.ar_f128);
00540 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_64)
00541 status |= ar_ctoi64 (&result->ar_ieee64, &re.ar_f64);
00542 else
00543 return AR_STAT_INVALID_TYPE;
00544 else if (AR_FLOAT_SIZE (reimtype) == AR_FLOAT_32)
00545 status |= ar_i32to64 (&result->ar_ieee64, &re.ar_ieee32);
00546 else {
00547 result->ar_ieee64 = re.ar_ieee64;
00548 status = AR_status ((AR_DATA*)result, resulttype);
00549 }
00550 }
00551
00552 } else if (AR_CLASS (*opndtype) == AR_CLASS_INT) {
00553
00554
00555 ar_convert_to_integral (&sint64, &sint64type, opnd, opndtype);
00556
00557 switch (*resulttype) {
00558 case AR_Float_Cray1_64:
00559 case AR_Float_Cray1_64_F:
00560 status |= ar_cflt64 (&result->ar_f64, &sint64.ar_i64,
00561 AR_SIGNEDNESS (*opndtype) == AR_UNSIGNED);
00562 break;
00563 case AR_Float_Cray1_128:
00564 status |= ar_cflt128 (&result->ar_f128, &sint64.ar_i64,
00565 AR_SIGNEDNESS (*opndtype) == AR_UNSIGNED);
00566 break;
00567 case AR_Float_IEEE_NR_32:
00568 case AR_Float_IEEE_ZE_32:
00569 case AR_Float_IEEE_UP_32:
00570 case AR_Float_IEEE_DN_32:
00571 status |= ar_iflt32 (&result->ar_ieee32, &sint64.ar_i64,
00572 AR_SIGNEDNESS (*opndtype) == AR_UNSIGNED,
00573 ROUND_MODE (*resulttype));
00574 break;
00575 case AR_Float_IEEE_NR_64:
00576 case AR_Float_IEEE_ZE_64:
00577 case AR_Float_IEEE_UP_64:
00578 case AR_Float_IEEE_DN_64:
00579 status |= ar_iflt64 (&result->ar_ieee64, &sint64.ar_i64,
00580 AR_SIGNEDNESS (*opndtype) == AR_UNSIGNED,
00581 ROUND_MODE (*resulttype));
00582 break;
00583 case AR_Float_IEEE_NR_128:
00584 case AR_Float_IEEE_ZE_128:
00585 case AR_Float_IEEE_UP_128:
00586 case AR_Float_IEEE_DN_128:
00587 status |= ar_iflt128 (&result->ar_ieee128, &sint64.ar_i64,
00588 AR_SIGNEDNESS (*opndtype) == AR_UNSIGNED,
00589 ROUND_MODE (*resulttype));
00590 break;
00591 default:
00592 return AR_STAT_INVALID_TYPE;
00593 }
00594
00595 } else
00596 return AR_STAT_INVALID_TYPE;
00597
00598 return status;
00599 }
00600
00601
00602 int
00603 ar_convert_to_complex
00604 (ar_data *result, const AR_TYPE *resulttype,
00605 const ar_data *opnd, const AR_TYPE *opndtype) {
00606
00607 ar_data from, re, im, cre, cim;
00608 AR_TYPE reimtype, parttype, temptype;
00609 int status = AR_STAT_OK, restat, imstat;
00610
00611 parttype = (AR_TYPE) (*resulttype ^ AR_FLOAT_COMPLEX);
00612
00613 if (AR_CLASS (*opndtype) == AR_CLASS_FLOAT &&
00614 AR_FLOAT_IS_COMPLEX (*opndtype) == AR_FLOAT_COMPLEX) {
00615 status |= ar_decompose_complex (&re, &im, &reimtype,
00616 opnd, opndtype);
00617 restat = ar_convert_to_float (&cre, &parttype, &re, &reimtype);
00618 imstat = ar_convert_to_float (&cim, &parttype, &im, &reimtype);
00619 status |= ar_compose_complex (result, &temptype,
00620 &cre, &cim, &parttype);
00621 status &= ~(AR_STAT_ZERO | AR_STAT_NEGATIVE);
00622 status |= restat & imstat & AR_STAT_ZERO;
00623 return status;
00624 }
00625
00626 status |= ar_convert_to_float (&cre, &parttype, opnd, opndtype);
00627
00628 switch (*resulttype) {
00629 case AR_Complex_Cray1_64:
00630 case AR_Complex_Cray1_64_F:
00631 result->ar_cplx_f64.real = cre.ar_f64;
00632 ZEROCRAY64 (result->ar_cplx_f64.imag);
00633 break;
00634 case AR_Complex_Cray1_128:
00635 result->ar_cplx_f128.real = cre.ar_f128;
00636 ZEROCRAY128 (result->ar_cplx_f128.imag);
00637 break;
00638 case AR_Complex_IEEE_NR_32:
00639 case AR_Complex_IEEE_ZE_32:
00640 case AR_Complex_IEEE_UP_32:
00641 case AR_Complex_IEEE_DN_32:
00642 IEEE32_TO_CPLX32_REAL(result->ar_cplx_ieee32, cre.ar_ieee32);
00643 result->ar_cplx_ieee32.isign = 0;
00644 result->ar_cplx_ieee32.iexpo = 0;
00645 result->ar_cplx_ieee32.icoeff0 = 0;
00646 result->ar_cplx_ieee32.icoeff1 = 0;
00647 break;
00648 case AR_Complex_IEEE_NR_64:
00649 case AR_Complex_IEEE_ZE_64:
00650 case AR_Complex_IEEE_UP_64:
00651 case AR_Complex_IEEE_DN_64:
00652 result->ar_cplx_ieee64.real = cre.ar_ieee64;
00653 ZEROIEEE64 (result->ar_cplx_ieee64.imag);
00654 break;
00655 case AR_Complex_IEEE_NR_128:
00656 case AR_Complex_IEEE_ZE_128:
00657 case AR_Complex_IEEE_UP_128:
00658 case AR_Complex_IEEE_DN_128:
00659 result->ar_cplx_ieee128.real = cre.ar_ieee128;
00660 ZEROIEEE128 (result->ar_cplx_ieee128.imag);
00661 break;
00662 default:
00663 return AR_STAT_INVALID_TYPE;
00664 }
00665
00666 return status;
00667 }
00668
00669
00670
00671 int
00672 AR_convert
00673 (AR_DATA *res, const AR_TYPE *resulttype,
00674 const AR_DATA *opd, const AR_TYPE *opndtype) {
00675
00676 ar_data* result = (ar_data*)res;
00677 ar_data* opnd = (ar_data*)opd;
00678
00679 if (AR_CLASS (*resulttype) == AR_CLASS_INT)
00680 return ar_convert_to_integral (result, resulttype, opnd, opndtype);
00681
00682 if (AR_CLASS (*resulttype) == AR_CLASS_POINTER)
00683 return ar_convert_to_pointer (result, resulttype, opnd, opndtype);
00684
00685 if (AR_CLASS (*resulttype) == AR_CLASS_FLOAT)
00686 if (AR_FLOAT_IS_COMPLEX (*resulttype) == AR_FLOAT_COMPLEX)
00687 return ar_convert_to_complex (result, resulttype, opnd, opndtype);
00688 else
00689 return ar_convert_to_float (result, resulttype, opnd, opndtype);
00690
00691 return AR_STAT_INVALID_TYPE;
00692 }
00693
00694
00695
00696 int
00697 AR_round_int_div
00698 (AR_DATA *res, const AR_TYPE *resulttype,
00699 const AR_DATA *opd, const AR_TYPE *opndtype) {
00700
00701 ar_data* result = (ar_data*)res;
00702 ar_data* opnd = (ar_data*)opd;
00703
00704 if (*resulttype != *opndtype)
00705 return AR_STAT_INVALID_TYPE;
00706
00707 if (*resulttype == AR_Float_Cray1_64 ||
00708 *resulttype == AR_Float_Cray1_64_F)
00709 return ar_crnd64 (&result->ar_f64, &opnd->ar_f64);
00710 else if (*resulttype == AR_Float_Cray1_128)
00711 return ar_crnd128 (&result->ar_f128, &opnd->ar_f128);
00712 else
00713 return AR_STAT_INVALID_TYPE;
00714 }
00715
00716
00717 static char USMID [] = "\n%Z%%M% %I% %G% %U%\n";
00718 static char rcsid [] = "$Id: cvt.c,v 1.1.1.1 2002-05-22 20:06:18 dsystem Exp $";