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
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 #define USE_STANDARD_TYPES 1
00085 #define __STDC_LIMIT_MACROS
00086 #include <stdint.h>
00087 #include <limits.h>
00088 #include <fp_class.h>
00089 #include "defs.h"
00090 #include "config.h"
00091 #include "config_asm.h"
00092 #include "erglob.h"
00093 #include "tracing.h"
00094
00095 #include "mempool.h"
00096 #include "mtypes.h"
00097 #include "strtab.h"
00098 #include "opcode.h"
00099 #include "wintrinsic.h"
00100 #include "wn_core.h"
00101 #include "stab.h"
00102 #include "targ_const.h"
00103 #include "const.h"
00104 #include "quad.h"
00105 #include "quadsim.h"
00106 #include <math.h>
00107
00108
00109
00110 #define DMANTWIDTH 52
00111 #define DEXPWIDTH 11
00112 #define DSIGNMASK 0x7fffffffffffffffll
00113 #define DEXPMASK 0x800fffffffffffffll
00114 #define DQNANBITMASK 0xfff7ffffffffffffll
00115
00116 #define MANTWIDTH 23
00117 #define EXPWIDTH 8
00118 #define SIGNMASK 0x7fffffff
00119 #define EXPMASK 0x807fffff
00120 #define QNANBITMASK 0xffbfffff
00121
00122
00123 #ifndef M_PI
00124 #define M_PI 3.14159265358979323846
00125 #endif
00126
00127 #define MIN_INT_I8 (((mINT64)1)<<(sizeof(mINT64)*8 - 1))
00128 #define MIN_INT_I4 (1<<(sizeof(mINT32)*8 - 1))
00129 #define MIN_INT_I2 (1<<(sizeof(mINT16)*8 - 1))
00130
00131
00132 #define LOGICAL_MTYPE MTYPE_U4
00133
00134 #include "targ_const_private.h"
00135
00136 #if defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 400) && _SGIAPI
00137 #define QUAD_PRECISION_SUPPORTED
00138 #else
00139 #undef QUAD_PRECISION_SUPPORTED
00140 #endif
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 TCON Zero_I4_Tcon = { MTYPE_I4 };
00153 TCON Zero_I8_Tcon = { MTYPE_I8 };
00154 TCON Quad_Zero_Tcon = { MTYPE_FQ };
00155
00156 static TCON Targ_Ipower(TCON base, UINT64 exp, BOOL neg_exp, BOOL *folded, TYPE_ID btype);
00157 static TCON Targ_Power(TCON base, TCON exp, BOOL *folded, TYPE_ID btype);
00158
00159
00160 TCON Targ_Conv ( TYPE_ID ty_to, TCON c );
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 typedef union QUAD_REPRESENTATION
00175 {
00176 QUAD_TYPE a_quadtype;
00177 QUAD a_quad;
00178 #ifdef QUAD_PRECISION_SUPPORTED
00179 long double a_longdouble;
00180 #endif
00181 } Quad_Representation;
00182
00183 static QUAD
00184 R16_To_RQ(QUAD_TYPE qt)
00185 {
00186 Quad_Representation repr;
00187
00188 repr.a_quadtype = qt;
00189 return repr.a_quad;
00190 }
00191
00192 static QUAD_TYPE
00193 RQ_To_R16(QUAD q)
00194 {
00195 Quad_Representation repr;
00196
00197 repr.a_quad = q;
00198 return repr.a_quadtype;
00199 }
00200
00201 #ifdef QUAD_PRECISION_SUPPORTED
00202 static long double
00203 R16_To_RLD(QUAD_TYPE qt)
00204 {
00205 Quad_Representation repr;
00206
00207 repr.a_quadtype = qt;
00208 return repr.a_longdouble;
00209 }
00210
00211 static QUAD_TYPE
00212 RLD_To_R16(long double q)
00213 {
00214 Quad_Representation repr;
00215
00216 repr.a_longdouble = q;
00217 return repr.a_quadtype;
00218 }
00219 #endif
00220
00221 #ifdef Is_True_On
00222 void
00223 Check_TCON ( TCON *tc )
00224 {
00225 switch (TCON_ty(*tc)) {
00226 case MTYPE_I1:
00227 case MTYPE_I2:
00228 case MTYPE_I4:
00229 case MTYPE_U1:
00230 case MTYPE_U2:
00231 case MTYPE_U4:
00232 case MTYPE_F4:
00233 Is_True ( TCON_v1(*tc)|TCON_v2(*tc)|TCON_v3(*tc) == 0,
00234 ("High order word of %s TCON non zero %x",
00235 Mtype_Name(TCON_ty(*tc)), TCON_v1(*tc)) );
00236 break;
00237 case MTYPE_I8:
00238 case MTYPE_U8:
00239 case MTYPE_F8:
00240 Is_True ( TCON_v2(*tc)|TCON_v3(*tc) == 0,
00241 ("High order word of %s TCON non zero %x",
00242 Mtype_Name(TCON_ty(*tc)), TCON_v1(*tc)) );
00243 break;
00244 #ifdef TARG_NEEDS_QUAD_OPS
00245 case MTYPE_FQ:
00246 {
00247 QUAD q = R16_To_RQ(TCON_R16(*tc));
00248
00249
00250
00251
00252
00253 if ( q.hi == 0.0 && q.lo != 0.0)
00254 ErrMsg( EC_Ill_Quad_Const, TCON_u0(*tc), TCON_u1(*tc), TCON_u2(*tc), TCON_u3(*tc));
00255 }
00256 break;
00257 #endif
00258 default:
00259 break;
00260 }
00261 }
00262 #endif
00263
00264
00265
00266
00267
00268
00269 static TCON complex_sqrt(TCON c0)
00270 {
00271 float fr,fi,fmag;
00272 double dr,di,dmag;
00273 TCON r;
00274
00275 TCON_clear(r);
00276 TCON_ty(r) = TCON_ty(c0);
00277
00278 switch (TCON_ty(c0)) {
00279 case MTYPE_C4:
00280 fr = TCON_R4(c0);
00281 fi = TCON_IR4(c0);
00282 if( (fmag = hypotf(fr, fi)) == 0.)
00283 TCON_R4(r) = TCON_IR4(r) = 0.;
00284 else if (fr > 0) {
00285 TCON_R4(r) = sqrtf(0.5 * (fmag + fr) );
00286 TCON_IR4(r) = fi / TCON_R4(r) / 2;
00287 } else {
00288 TCON_IR4(r) = sqrtf(0.5 * (fmag - fr) );
00289 if (fi < 0) TCON_IR4(r) = -TCON_IR4(r);
00290 TCON_R4(r) = fi / TCON_IR4(r) /2;
00291 }
00292 break;
00293
00294 case MTYPE_C8:
00295 dr = TCON_R8(c0);
00296 di = TCON_IR8(c0);
00297 if( (dmag = hypot(dr, di)) == 0.)
00298 TCON_R8(r) = TCON_IR8(r) = 0.;
00299 else if (dr > 0) {
00300 TCON_R8(r) = sqrt(0.5 * (dmag + dr) );
00301 TCON_IR8(r) = di / TCON_R8(r) / 2;
00302 } else {
00303 TCON_IR8(r) = sqrt(0.5 * (dmag - dr) );
00304 if (di < 0) TCON_IR8(r) = -TCON_IR8(r);
00305 TCON_R8(r) = di / TCON_IR8(r) /2;
00306 }
00307 break;
00308
00309 #ifdef TARG_NEEDS_QUAD_OPS
00310 case MTYPE_CQ:
00311 QUAD qr,qi,qmag,rqr,rqi,q0,q05;
00312 INT err;
00313 qr = R16_To_RQ(TCON_R16(c0));
00314 qi = R16_To_RQ(TCON_IR16(c0));
00315 q0 = __c_q_ext(0.0,&err);
00316 q05 = __c_q_ext(0.5,&err);
00317
00318 #ifdef TODO_MONGOOSE
00319
00320
00321
00322 #endif
00323 qmag = __c_q_sqrt(__c_q_add(__c_q_mul(qi,qi,&err),
00324 __c_q_mul(qr,qr,&err),
00325 &err),&err);
00326 if (__c_q_eq(qmag,q0,&err)) {
00327 rqr = q0;
00328 rqi = q0;
00329 }
00330 else if (__c_q_gt(qr,q0,&err)) {
00331 rqr = __c_q_sqrt(__c_q_mul(q05,__c_q_add(qmag,qr,&err),&err),&err);
00332 rqi = __c_q_mul(q05,__c_q_div(qi,rqr,&err),&err);
00333 } else {
00334 rqi = __c_q_sqrt(__c_q_mul(q05,__c_q_sub(qmag,qr,&err),&err),&err);
00335 if (__c_q_lt(qi,q0,&err)) rqi = __c_q_neg(rqi,&err);
00336 rqr = __c_q_mul(q05,__c_q_div(qi,rqi,&err),&err);
00337 }
00338 TCON_R16(r) = RQ_To_R16(rqr);
00339 TCON_IR16(r) = RQ_To_R16(rqi);
00340 break;
00341 #endif
00342
00343 default:
00344 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(c0)), "complex_sqrt" );
00345 }
00346
00347 return (r);
00348 }
00349
00350 static TCON complex_divide(TCON c0, TCON c1)
00351 {
00352 TCON r;
00353
00354 TCON_clear(r);
00355 TCON_ty(r) = TCON_ty(c0);
00356
00357 switch (TCON_ty(c0)) {
00358 case MTYPE_C4:
00359 {
00360 float c0r,c0i,c1r,c1i,t1,t2,t3;
00361 c0r = TCON_R4(c0);
00362 c0i = TCON_IR4(c0);
00363 c1r = TCON_R4(c1);
00364 c1i = TCON_IR4(c1);
00365 if (fabsf(c1r) < fabsf(c1i)) {
00366 t2 = c1r*(c1r/c1i) + c1i;
00367 t1 = (c0i*(c1r/c1i) - c0r)/t2;
00368 t3 = (c0r*(c1r/c1i) + c0i)/t2;
00369 } else {
00370 t2 = c1i*(c1i/c1r) + c1r;
00371 t1 = (c0i - c0r*(c1i/c1r))/t2;
00372 t3 = (c0i*(c1i/c1r) + c0r)/t2;
00373 }
00374 TCON_R4(r) = t3;
00375 TCON_IR4(r) = t1;
00376 }
00377 break;
00378
00379 case MTYPE_C8:
00380 {
00381 double c0r,c0i,c1r,c1i,t1,t2,t3;
00382 c0r = TCON_R8(c0);
00383 c0i = TCON_IR8(c0);
00384 c1r = TCON_R8(c1);
00385 c1i = TCON_IR8(c1);
00386 if (fabs(c1r) < fabs(c1i)) {
00387 t2 = c1r*(c1r/c1i) + c1i;
00388 t1 = (c0i*(c1r/c1i) - c0r)/t2;
00389 t3 = (c0r*(c1r/c1i) + c0i)/t2;
00390 } else {
00391 t2 = c1i*(c1i/c1r) + c1r;
00392 t1 = (c0i - c0r*(c1i/c1r))/t2;
00393 t3 = (c0i*(c1i/c1r) + c0r)/t2;
00394 }
00395 TCON_R8(r) = t3;
00396 TCON_IR8(r) = t1;
00397 }
00398 break;
00399
00400 #ifdef TARG_NEEDS_QUAD_OPS
00401 case MTYPE_CQ:
00402 {
00403 QUAD c0r,c0i,c1r,c1i,t1,t2,t3,t4,ar,ai,q0;
00404 INT err;
00405 q0 = __c_q_ext(0.0,&err);
00406 c0r = R16_To_RQ(TCON_R16(c0));
00407 c0i = R16_To_RQ(TCON_IR16(c0));
00408 c1r = R16_To_RQ(TCON_R16(c1));
00409 c1i = R16_To_RQ(TCON_IR16(c1));
00410 ar = c1r;
00411 ai = c1i;
00412 if (__c_q_lt(ar,q0,&err)) ar = __c_q_neg(ar,&err);
00413 if (__c_q_lt(ai,q0,&err)) ai = __c_q_neg(ai,&err);
00414 if (__c_q_lt(ar,ai,&err)) {
00415 t4 = __c_q_div(c1r,c1i,&err);
00416 t2 = __c_q_add(c1i,__c_q_mul(c1r,t4,&err),&err);
00417 t1 = __c_q_div(__c_q_sub(__c_q_mul(c0i,t4,&err),c0r,&err),
00418 t2,&err);
00419 t3 = __c_q_div(__c_q_add(__c_q_mul(c0r,t4,&err),c0i,&err),
00420 t2,&err);
00421 } else {
00422 t4 = __c_q_div(c1i,c1r,&err);
00423 t2 = __c_q_add(c1r,__c_q_mul(c1i,t4,&err),&err);
00424 t1 = __c_q_div(__c_q_sub(c0i,__c_q_mul(c0r,t4,&err),&err),
00425 t2,&err);
00426 t3 = __c_q_div(__c_q_add(__c_q_mul(c0i,t4,&err),c0r,&err),
00427 t2,&err);
00428 }
00429 TCON_R16(r) = RQ_To_R16(t3);
00430 TCON_IR16(r) = RQ_To_R16(t1);
00431 }
00432 break;
00433 #endif
00434
00435 default:
00436 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(c0)), "complex_divide" );
00437 }
00438
00439 return (r);
00440 }
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454 static TCON
00455 Targ_Convert_Length (
00456 TCON c0,
00457 TCON c1,
00458 TYPE_ID mtype,
00459 INT16 len,
00460 BOOL sign )
00461 {
00462 static const INT64 one = 1;
00463 INT64 sval = Targ_To_Host ( c0 );
00464 INT64 slen = Targ_To_Host ( c1 );
00465
00466
00467
00468
00469 if ( slen >= len ) {
00470 if ( len == 32 ) {
00471 mINT32 tval = sval & 0x0ffffffff;
00472 return Host_To_Targ ( mtype, tval );
00473 } else if ( len == 64 ) {
00474 return Host_To_Targ ( mtype, sval );
00475 } else {
00476 ErrMsg ( EC_Unimplemented, "Targ_Convert_Length: bad length 1" );
00477 }
00478 }
00479
00480 if ( len == 32 ) {
00481 mINT32 highmask = (-1) << slen;
00482 mINT32 signmask = 1 << (slen-1);
00483 mINT32 tval = ( sval & ~highmask );
00484
00485 if ( sign && ((tval & signmask) != 0) ) {
00486 tval |= highmask;
00487 }
00488 return Host_To_Targ ( mtype, tval );
00489
00490 } else if ( len == 64 ) {
00491 INT64 highmask = (-one) << slen;
00492 INT64 signmask = one << (slen-1);
00493 INT64 tval = ( sval & ~highmask );
00494
00495 if ( sign && ((tval & signmask) != 0) ) {
00496 tval |= highmask;
00497 }
00498 return Host_To_Targ ( mtype, tval );
00499
00500 } else {
00501 ErrMsg ( EC_Unimplemented, "Targ_Convert_Length: bad length 2" );
00502 return c0;
00503 }
00504
00505 }
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540 #define BOTH_OPNDS(op0,op1,type) \
00541 if (type != MTYPE_U8) { op0=Targ_Conv(type,op0);op1=Targ_Conv(type,op1); } \
00542 TCON_ty(op0)=type
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563 TCON
00564 Targ_WhirlOp ( OPCODE op, TCON c0, TCON c1, BOOL *folded )
00565 {
00566 #ifdef TARG_NEEDS_QUAD_OPS
00567 QUAD q0, q1;
00568 INT err;
00569 #endif
00570 TCON t1, t2;
00571 TYPE_ID optype;
00572 BOOL dummy_folded;
00573
00574 #ifdef Is_True_On
00575 Check_TCON (&c0);
00576 Check_TCON (&c1);
00577 #endif
00578
00579 #undef DEBUG_FOLD
00580 #ifdef DEBUG_FOLD
00581 printf("Folding %s on 0x%llx (%s), 0x%llx (%s), result",OPCODE_name(op),
00582 TCON_I8(c0),Mtype_Name(TCON_ty(c0)),TCON_I8(c1),Mtype_Name(TCON_ty(c1)));
00583 #endif
00584
00585 if (!folded) {
00586 folded = &dummy_folded;
00587 }
00588
00589 *folded = TRUE;
00590
00591 optype = OPCODE_rtype(op);
00592 TYPE_ID desc = OPCODE_desc(op);
00593 OPERATOR opr = OPCODE_operator(op);
00594
00595 if (OPERATOR_is_compare(opr)) {
00596 if (MTYPE_is_integral(desc))
00597 BOTH_OPNDS(c0,c1,desc);
00598 switch (desc) {
00599 case MTYPE_I4:
00600 switch (opr) {
00601 case OPR_EQ: TCON_I4(c0) = TCON_I4(c0) == TCON_I4(c1); break;
00602 case OPR_NE: TCON_I4(c0) = TCON_I4(c0) != TCON_I4(c1); break;
00603 case OPR_LT: TCON_I4(c0) = TCON_I4(c0) < TCON_I4(c1); break;
00604 case OPR_LE: TCON_I4(c0) = TCON_I4(c0) <= TCON_I4(c1); break;
00605 case OPR_GT: TCON_I4(c0) = TCON_I4(c0) > TCON_I4(c1); break;
00606 case OPR_GE: TCON_I4(c0) = TCON_I4(c0) >= TCON_I4(c1); break;
00607 }
00608 break;
00609 case MTYPE_U4:
00610 switch (opr) {
00611 case OPR_EQ: TCON_I4(c0) = TCON_U4(c0) == TCON_U4(c1); break;
00612 case OPR_NE: TCON_I4(c0) = TCON_U4(c0) != TCON_U4(c1); break;
00613 case OPR_LT: TCON_I4(c0) = TCON_U4(c0) < TCON_U4(c1); break;
00614 case OPR_LE: TCON_I4(c0) = TCON_U4(c0) <= TCON_U4(c1); break;
00615 case OPR_GT: TCON_I4(c0) = TCON_U4(c0) > TCON_U4(c1); break;
00616 case OPR_GE: TCON_I4(c0) = TCON_U4(c0) >= TCON_U4(c1); break;
00617 }
00618 break;
00619 case MTYPE_I8:
00620 switch (opr) {
00621 case OPR_EQ: TCON_v0(c0) = TCON_I8(c0) == TCON_I8(c1); break;
00622 case OPR_NE: TCON_v0(c0) = TCON_I8(c0) != TCON_I8(c1); break;
00623 case OPR_LT: TCON_v0(c0) = TCON_I8(c0) < TCON_I8(c1); break;
00624 case OPR_LE: TCON_v0(c0) = TCON_I8(c0) <= TCON_I8(c1); break;
00625 case OPR_GT: TCON_v0(c0) = TCON_I8(c0) > TCON_I8(c1); break;
00626 case OPR_GE: TCON_v0(c0) = TCON_I8(c0) >= TCON_I8(c1); break;
00627 }
00628 TCON_v1(c0) = 0;
00629 break;
00630 case MTYPE_U8:
00631 switch (opr) {
00632 case OPR_EQ: TCON_v0(c0) = TCON_U8(c0) == TCON_U8(c1); break;
00633 case OPR_NE: TCON_v0(c0) = TCON_U8(c0) != TCON_U8(c1); break;
00634 case OPR_LT: TCON_v0(c0) = TCON_U8(c0) < TCON_U8(c1); break;
00635 case OPR_LE: TCON_v0(c0) = TCON_U8(c0) <= TCON_U8(c1); break;
00636 case OPR_GT: TCON_v0(c0) = TCON_U8(c0) > TCON_U8(c1); break;
00637 case OPR_GE: TCON_v0(c0) = TCON_U8(c0) >= TCON_U8(c1); break;
00638 }
00639 TCON_v1(c0) = 0;
00640 break;
00641 case MTYPE_F4:
00642 switch (opr) {
00643 case OPR_EQ: TCON_v0(c0) = TCON_R4(c0) == TCON_R4(c1); break;
00644 case OPR_NE: TCON_v0(c0) = TCON_R4(c0) != TCON_R4(c1); break;
00645 case OPR_LT: TCON_v0(c0) = TCON_R4(c0) < TCON_R4(c1); break;
00646 case OPR_LE: TCON_v0(c0) = TCON_R4(c0) <= TCON_R4(c1); break;
00647 case OPR_GT: TCON_v0(c0) = TCON_R4(c0) > TCON_R4(c1); break;
00648 case OPR_GE: TCON_v0(c0) = TCON_R4(c0) >= TCON_R4(c1); break;
00649 }
00650 TCON_v1(c0) = 0;
00651 break;
00652 case MTYPE_F8:
00653 switch (opr) {
00654 case OPR_EQ: TCON_v0(c0) = TCON_R8(c0) == TCON_R8(c1); break;
00655 case OPR_NE: TCON_v0(c0) = TCON_R8(c0) != TCON_R8(c1); break;
00656 case OPR_LT: TCON_v0(c0) = TCON_R8(c0) < TCON_R8(c1); break;
00657 case OPR_LE: TCON_v0(c0) = TCON_R8(c0) <= TCON_R8(c1); break;
00658 case OPR_GT: TCON_v0(c0) = TCON_R8(c0) > TCON_R8(c1); break;
00659 case OPR_GE: TCON_v0(c0) = TCON_R8(c0) >= TCON_R8(c1); break;
00660 }
00661 TCON_v1(c0) = 0;
00662 break;
00663 #ifdef TARG_NEEDS_QUAD_OPS
00664 case MTYPE_FQ:
00665 q0 = R16_To_RQ(TCON_R16(c0));
00666 q1 = R16_To_RQ(TCON_R16(c1));
00667 switch (opr) {
00668 case OPR_EQ: TCON_v0(c0) = __c_q_eq ( q0, q1, &err ); break;
00669 case OPR_NE: TCON_v0(c0) = __c_q_ne ( q0, q1, &err ); break;
00670 case OPR_LT: TCON_v0(c0) = __c_q_lt ( q0, q1, &err ); break;
00671 case OPR_LE: TCON_v0(c0) = __c_q_le ( q0, q1, &err ); break;
00672 case OPR_GT: TCON_v0(c0) = __c_q_gt ( q0, q1, &err ); break;
00673 case OPR_GE: TCON_v0(c0) = __c_q_ge ( q0, q1, &err ); break;
00674 }
00675 TCON_v1(c0) = 0;
00676 TCON_v2(c0) = 0;
00677 TCON_v3(c0) = 0;
00678 break;
00679 #endif
00680 case MTYPE_C4:
00681 switch (opr) {
00682 case OPR_EQ: TCON_v0(c0) = (TCON_R4(c0) == TCON_R4(c1)) &&
00683 (TCON_IR4(c0) == TCON_IR4(c1)); break;
00684 case OPR_NE: TCON_v0(c0) = (TCON_R4(c0) != TCON_R4(c1)) ||
00685 (TCON_IR4(c0) != TCON_IR4(c1)); break;
00686 }
00687 TCON_v1(c0) = 0;
00688 break;
00689 case MTYPE_C8:
00690 switch (opr) {
00691 case OPR_EQ: TCON_v0(c0) = (TCON_R8(c0) == TCON_R8(c1)) &&
00692 (TCON_IR8(c0) == TCON_IR8(c1)); break;
00693 case OPR_NE: TCON_v0(c0) = (TCON_R8(c0) != TCON_R8(c1)) ||
00694 (TCON_IR8(c0) != TCON_IR8(c1)); break;
00695 }
00696 TCON_v1(c0) = 0;
00697 break;
00698 #ifdef TARG_NEEDS_QUAD_OPS
00699 case MTYPE_CQ:
00700 q0 = R16_To_RQ(TCON_R16(c0));
00701 q1 = R16_To_RQ(TCON_R16(c1));
00702 switch (opr) {
00703 case OPR_EQ: TCON_v0(c0) = __c_q_eq ( q0, q1, &err ); break;
00704 case OPR_NE: TCON_v0(c0) = __c_q_ne ( q0, q1, &err ); break;
00705 }
00706 q0 = R16_To_RQ(TCON_IR16(c0));
00707 q1 = R16_To_RQ(TCON_IR16(c1));
00708 switch (opr) {
00709 case OPR_EQ: TCON_v0(c0) &= __c_q_eq ( q0, q1, &err ); break;
00710 case OPR_NE: TCON_v0(c0) |= __c_q_ne ( q0, q1, &err ); break;
00711 }
00712 TCON_v1(c0) = 0;
00713 TCON_v2(c0) = 0;
00714 TCON_v3(c0) = 0;
00715 break;
00716 #endif
00717 }
00718 TCON_ty(c0) = optype;
00719 }
00720 else
00721 switch (op) {
00722
00723 case OPC_F4PAREN:
00724 case OPC_F8PAREN:
00725 case OPC_FQPAREN:
00726 case OPC_C4PAREN:
00727 case OPC_C8PAREN:
00728 case OPC_CQPAREN:
00729
00730 break;
00731
00732
00733 case OPC_I8CVTL:
00734 c0 = Targ_Convert_Length(c0,c1,MTYPE_I8,64,TRUE);
00735 break;
00736 case OPC_I4CVTL:
00737 c0 = Targ_Convert_Length(c0,c1,MTYPE_I4,32,TRUE);
00738 break;
00739 case OPC_U8CVTL:
00740 c0 = Targ_Convert_Length(c0,c1,MTYPE_U8,64,FALSE);
00741 break;
00742 case OPC_U4CVTL:
00743 c0 = Targ_Convert_Length(c0,c1,MTYPE_U4,32,FALSE);
00744 break;
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758 case OPC_I8SHL:
00759 case OPC_U8SHL:
00760 c0 = Targ_Conv(optype, c0);
00761 if ((TCON_I8U8I4U4(c1) >= 0) && (TCON_I8U8I4U4(c1) <= 63)) {
00762 TCON_I8(c0) <<= TCON_I8U8I4U4(c1);
00763 } else {
00764 TCON_I8(c0) = 0;
00765 }
00766 break;
00767 case OPC_I4SHL:
00768 case OPC_U4SHL:
00769 c0 = Targ_Conv(optype, c0);
00770 if ((TCON_I8U8I4U4(c1) >= 0) && (TCON_I8U8I4U4(c1) <= 31)) {
00771 TCON_I4(c0) <<= TCON_I8U8I4U4(c1);
00772 } else {
00773 TCON_I4(c0) = 0;
00774 }
00775 break;
00776
00777 case OPC_I8LSHR:
00778 case OPC_U8LSHR:
00779 c0 = Targ_Conv(optype, c0);
00780 if ((TCON_I8U8I4U4(c1) >= 0) && (TCON_I8U8I4U4(c1) <= 63)) {
00781 TCON_U8(c0) >>= TCON_I8U8I4U4(c1);
00782 } else {
00783 TCON_U8(c0) = 0;
00784 }
00785 break;
00786 case OPC_I4LSHR:
00787 case OPC_U4LSHR:
00788 c0 = Targ_Conv(optype, c0);
00789 if ((TCON_I8U8I4U4(c1) >= 0) && (TCON_I8U8I4U4(c1) <= 31)) {
00790 TCON_U4(c0) >>= TCON_I8U8I4U4(c1);
00791 } else {
00792 TCON_U4(c0) = 0;
00793 }
00794 break;
00795
00796 case OPC_I8ASHR:
00797 case OPC_U8ASHR:
00798 c0 = Targ_Conv(optype, c0);
00799 TCON_I8(c0) >>= ((TCON_I8U8I4U4(c1) >= 0) && (TCON_I8U8I4U4(c1) <= 63)) ? TCON_I8U8I4U4(c1) : 63;
00800 break;
00801 case OPC_I4ASHR:
00802 case OPC_U4ASHR:
00803 c0 = Targ_Conv(optype, c0);
00804 TCON_I4(c0) >>= ((TCON_I8U8I4U4(c1) >= 0) && (TCON_I8U8I4U4(c1) <= 31)) ? TCON_I8U8I4U4(c1) : 31;
00805 break;
00806
00807 case OPC_F4F8CVT:
00808 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
00809 c0 = Targ_Conv(MTYPE_F4, c0);
00810 break;
00811 case OPC_F8F4CVT:
00812 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
00813 c0 = Targ_Conv(MTYPE_F8, c0);
00814 break;
00815 #ifdef TARG_NEEDS_QUAD_OPS
00816 case OPC_FQF4CVT:
00817 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
00818 c0 = Targ_Conv(MTYPE_FQ, c0);
00819 break;
00820 case OPC_F4FQCVT:
00821 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
00822 c0 = Targ_Conv(MTYPE_F4, c0);
00823 break;
00824 case OPC_FQF8CVT:
00825 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
00826 c0 = Targ_Conv(MTYPE_FQ, c0);
00827 break;
00828 case OPC_F8FQCVT:
00829 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
00830 c0 = Targ_Conv(MTYPE_F8, c0);
00831 break;
00832 #endif
00833 case OPC_I4F4CVT:
00834 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
00835 c0 = Targ_Conv(MTYPE_I4, c0);
00836 break;
00837 case OPC_I4F8CVT:
00838 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
00839 c0 = Targ_Conv(MTYPE_I4, c0);
00840 break;
00841 #ifdef TARG_NEEDS_QUAD_OPS
00842 case OPC_I4FQCVT:
00843 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
00844 c0 = Targ_Conv(MTYPE_I4, c0);
00845 break;
00846 #endif
00847 case OPC_I8F4CVT:
00848 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
00849 c0 = Targ_Conv(MTYPE_I8, c0);
00850 break;
00851 case OPC_I8F8CVT:
00852 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
00853 c0 = Targ_Conv(MTYPE_I8, c0);
00854 break;
00855 #ifdef TARG_NEEDS_QUAD_OPS
00856 case OPC_I8FQCVT:
00857 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
00858 c0 = Targ_Conv(MTYPE_I8, c0);
00859 break;
00860 #endif
00861
00862 case OPC_U4F4CVT:
00863 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
00864 c0 = Targ_Conv(MTYPE_U4, c0);
00865 break;
00866 case OPC_U4F8CVT:
00867 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
00868 c0 = Targ_Conv(MTYPE_U4, c0);
00869 break;
00870 #ifdef TARG_NEEDS_QUAD_OPS
00871 case OPC_U4FQCVT:
00872 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
00873 c0 = Targ_Conv(MTYPE_U4, c0);
00874 break;
00875 #endif
00876 case OPC_U8F4CVT:
00877 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
00878 c0 = Targ_Conv(MTYPE_U8, c0);
00879 break;
00880 case OPC_U8F8CVT:
00881 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
00882 c0 = Targ_Conv(MTYPE_U8, c0);
00883 break;
00884 #ifdef TARG_NEEDS_QUAD_OPS
00885 case OPC_U8FQCVT:
00886 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
00887 c0 = Targ_Conv(MTYPE_U8, c0);
00888 break;
00889 #endif
00890 case OPC_I8I4CVT:
00891 case OPC_I8U4CVT:
00892 case OPC_U8I4CVT:
00893 case OPC_U8U4CVT:
00894 case OPC_I4I8CVT:
00895 case OPC_I4U8CVT:
00896 case OPC_U4I8CVT:
00897 case OPC_U4U8CVT:
00898 case OPC_I8BCVT:
00899 case OPC_U8BCVT:
00900 case OPC_I4BCVT:
00901 case OPC_U4BCVT:
00902 c0 = Targ_Conv(OPCODE_desc(op),c0);
00903 c0 = Targ_Conv(optype, c0);
00904 break;
00905
00906 case OPC_I4F8RND:
00907 if (TCON_R8(c0) >= 0.0) {
00908 TCON_I4(c0) = (INT32)(TCON_R8(c0) + 0.5);
00909 } else {
00910 TCON_I4(c0) = (INT32)(TCON_R8(c0) - 0.5);
00911 }
00912 TCON_v1(c0) = 0;
00913 TCON_ty(c0) = MTYPE_I4;
00914 break;
00915 case OPC_I4F4RND:
00916 if (TCON_R4(c0) >= 0.0) {
00917 TCON_I4(c0) = (INT32)(TCON_R4(c0) + 0.5);
00918 } else {
00919 TCON_I4(c0) = (INT32)(TCON_R4(c0) - 0.5);
00920 }
00921 TCON_v1(c0) = 0;
00922 TCON_ty(c0) = MTYPE_I4;
00923 break;
00924 #ifdef TARG_NEEDS_QUAD_OPS
00925 case OPC_I4FQRND:
00926 if (__c_q_ge(R16_To_RQ(TCON_R16(c0)),
00927 __c_q_flotj(0, &err),
00928 &err))
00929 TCON_R16(c0) = RQ_To_R16(__c_q_add(R16_To_RQ(TCON_R16(c0)),
00930 __c_q_ext(.5, &err),
00931 &err));
00932 else
00933 TCON_R16(c0) = RQ_To_R16(__c_q_sub(R16_To_RQ(TCON_R16(c0)),
00934 __c_q_ext(.5, &err),
00935 &err));
00936
00937 c0 = Targ_Conv(MTYPE_I4,c0);
00938 break;
00939 #endif
00940
00941 case OPC_I8F8RND:
00942 if (TCON_R8(c0) >= 0.0) {
00943 TCON_I8(c0) = (INT64)(TCON_R8(c0) + 0.5);
00944 } else {
00945 TCON_I8(c0) = (INT64)(TCON_R8(c0) - 0.5);
00946 }
00947 TCON_ty(c0) = MTYPE_I8;
00948 break;
00949 case OPC_I8F4RND:
00950 if (TCON_R4(c0) >= 0.0) {
00951 TCON_I8(c0) = (INT64)(TCON_R4(c0) + 0.5);
00952 } else {
00953 TCON_I8(c0) = (INT64)(TCON_R4(c0) - 0.5);
00954 }
00955 TCON_ty(c0) = MTYPE_I8;
00956 break;
00957 #ifdef TARG_NEEDS_QUAD_OPS
00958 case OPC_I8FQRND:
00959 if (__c_q_ge(R16_To_RQ(TCON_R16(c0)),
00960 __c_q_flotj(0, &err),
00961 &err))
00962 TCON_R16(c0) = RQ_To_R16(__c_q_add(R16_To_RQ(TCON_R16(c0)),
00963 __c_q_ext(.5, &err),
00964 &err));
00965 else
00966 TCON_R16(c0) = RQ_To_R16(__c_q_sub(R16_To_RQ(TCON_R16(c0)),
00967 __c_q_ext(.5, &err),
00968 &err));
00969
00970 c0 = Targ_Conv(MTYPE_I8,c0);
00971 break;
00972 #endif
00973
00974
00975 case OPC_I4F4TRUNC:
00976 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
00977 c0 = Targ_Conv(MTYPE_I4, c0);
00978 break;
00979 case OPC_I4F8TRUNC:
00980 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
00981 c0 = Targ_Conv(MTYPE_I4, c0);
00982 break;
00983 #ifdef TARG_NEEDS_QUAD_OPS
00984 case OPC_I4FQTRUNC:
00985 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
00986 c0 = Targ_Conv(MTYPE_I4, c0);
00987 break;
00988 #endif
00989
00990 case OPC_I8F4TRUNC:
00991 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
00992 c0 = Targ_Conv(MTYPE_I8, c0);
00993 break;
00994 case OPC_I8F8TRUNC:
00995 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
00996 c0 = Targ_Conv(MTYPE_I8, c0);
00997 break;
00998 #ifdef TARG_NEEDS_QUAD_OPS
00999 case OPC_I8FQTRUNC:
01000 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
01001 c0 = Targ_Conv(MTYPE_I8, c0);
01002 break;
01003 #endif
01004
01005
01006 case OPC_I4F4FLOOR:
01007 t1 = Targ_Conv(MTYPE_I4, c0);
01008 t2 = Targ_Conv(MTYPE_F4,t1);
01009 if (TCON_R4(t2) > TCON_R4(c0)) {
01010 TCON_I4(t1) -= 1;
01011 }
01012 c0 = t1;
01013 break;
01014 case OPC_I4F8FLOOR:
01015 t1 = Targ_Conv(MTYPE_I4, c0);
01016 t2 = Targ_Conv(MTYPE_F8,t1);
01017 if (TCON_R8(t2) > TCON_R8(c0)) {
01018 TCON_I4(t1) -= 1;
01019 }
01020 c0 = t1;
01021 break;
01022 #ifdef TARG_NEEDS_QUAD_OPS
01023 case OPC_I4FQFLOOR:
01024 t1 = Targ_Conv(MTYPE_I4, c0);
01025 t2 = Targ_Conv(MTYPE_FQ,t1);
01026 if (__c_q_gt(R16_To_RQ(TCON_R16(t2)),R16_To_RQ(TCON_R16(c0)),&err)) {
01027 TCON_I4(t1) -= 1;
01028 }
01029 c0 = t1;
01030 break;
01031 #endif
01032
01033 case OPC_I8F4FLOOR:
01034 t1 = Targ_Conv(MTYPE_I8, c0);
01035 t2 = Targ_Conv(MTYPE_F4,t1);
01036 if (TCON_R4(t2) > TCON_R4(c0)) {
01037 TCON_I8(t1) -= 1;
01038 }
01039 c0 = t1;
01040 break;
01041 case OPC_I8F8FLOOR:
01042 t1 = Targ_Conv(MTYPE_I8, c0);
01043 t2 = Targ_Conv(MTYPE_F8,t1);
01044 if (TCON_R8(t2) > TCON_R8(c0)) {
01045 TCON_I8(t1) -= 1;
01046 }
01047 c0 = t1;
01048 break;
01049 #ifdef TARG_NEEDS_QUAD_OPS
01050 case OPC_I8FQFLOOR:
01051 t1 = Targ_Conv(MTYPE_I8, c0);
01052 t2 = Targ_Conv(MTYPE_FQ,t1);
01053 if (__c_q_gt(R16_To_RQ(TCON_R16(t2)),R16_To_RQ(TCON_R16(c0)),&err)) {
01054 TCON_I8(t1) -= 1;
01055 }
01056 c0 = t1;
01057 break;
01058 #endif
01059
01060
01061 case OPC_I4F4CEIL:
01062 t1 = Targ_Conv(MTYPE_I4, c0);
01063 t2 = Targ_Conv(MTYPE_F4,t1);
01064 if (TCON_R4(t2) < TCON_R4(c0)) {
01065 TCON_I4(t1) += 1;
01066 }
01067 c0 = t1;
01068 break;
01069 case OPC_I4F8CEIL:
01070 t1 = Targ_Conv(MTYPE_I4, c0);
01071 t2 = Targ_Conv(MTYPE_F8,t1);
01072 if (TCON_R8(t2) < TCON_R8(c0)) {
01073 TCON_I4(t1) += 1;
01074 }
01075 c0 = t1;
01076 break;
01077 #ifdef TARG_NEEDS_QUAD_OPS
01078 case OPC_I4FQCEIL:
01079 t1 = Targ_Conv(MTYPE_I4, c0);
01080 t2 = Targ_Conv(MTYPE_FQ,t1);
01081 if (__c_q_lt(R16_To_RQ(TCON_R16(t2)),R16_To_RQ(TCON_R16(c0)),&err)) {
01082 TCON_I4(t1) += 1;
01083 }
01084 c0 = t1;
01085 break;
01086 #endif
01087
01088 case OPC_I8F4CEIL:
01089 t1 = Targ_Conv(MTYPE_I8, c0);
01090 t2 = Targ_Conv(MTYPE_F4,t1);
01091 if (TCON_R4(t2) < TCON_R4(c0)) {
01092 TCON_I8(t1) += 1;
01093 }
01094 c0 = t1;
01095 break;
01096 case OPC_I8F8CEIL:
01097 t1 = Targ_Conv(MTYPE_I8, c0);
01098 t2 = Targ_Conv(MTYPE_F8,t1);
01099 if (TCON_R8(t2) < TCON_R8(c0)) {
01100 TCON_I8(t1) += 1;
01101 }
01102 c0 = t1;
01103 break;
01104 #ifdef TARG_NEEDS_QUAD_OPS
01105 case OPC_I8FQCEIL:
01106 t1 = Targ_Conv(MTYPE_I8, c0);
01107 t2 = Targ_Conv(MTYPE_FQ,t1);
01108 if (__c_q_lt(R16_To_RQ(TCON_R16(t2)),R16_To_RQ(TCON_R16(c0)),&err)) {
01109 TCON_I8(t1) += 1;
01110 }
01111 c0 = t1;
01112 break;
01113 #endif
01114
01115 case OPC_U4F8RND:
01116 TCON_U4(c0) = (UINT32)(TCON_R8(c0) + 0.5);
01117 TCON_v1(c0) = 0;
01118 TCON_ty(c0) = MTYPE_U4;
01119 break;
01120
01121 case OPC_U4F4RND:
01122 TCON_U4(c0) = (UINT32)(TCON_R4(c0) + 0.5);
01123 TCON_v1(c0) = 0;
01124 TCON_ty(c0) = MTYPE_U4;
01125 break;
01126
01127 #ifdef TARG_NEEDS_QUAD_OPS
01128 case OPC_U4FQRND:
01129 TCON_R16(c0) = RQ_To_R16(__c_q_add(R16_To_RQ(TCON_R16(c0)),
01130 __c_q_ext(.5, &err),
01131 &err));
01132 c0 = Targ_Conv(MTYPE_U4,c0);
01133 break;
01134 #endif
01135
01136 case OPC_U8F8RND:
01137 TCON_U8(c0) = (UINT64)(TCON_R8(c0) + 0.5);
01138 TCON_v1(c0) = 0;
01139 TCON_ty(c0) = MTYPE_U8;
01140 break;
01141
01142 case OPC_U8F4RND:
01143 TCON_U8(c0) = (UINT64)(TCON_R4(c0) + 0.5);
01144 TCON_ty(c0) = MTYPE_U8;
01145 break;
01146
01147 #ifdef TARG_NEEDS_QUAD_OPS
01148 case OPC_U8FQRND:
01149 TCON_R16(c0) = RQ_To_R16(__c_q_add(R16_To_RQ(TCON_R16(c0)),
01150 __c_q_ext(.5, &err),
01151 &err));
01152 c0 = Targ_Conv(MTYPE_U8,c0);
01153 break;
01154 #endif
01155
01156 case OPC_U4F4FLOOR:
01157 case OPC_U4F4TRUNC:
01158 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
01159 c0 = Targ_Conv(MTYPE_U4, c0);
01160 break;
01161
01162 case OPC_U4F8FLOOR:
01163 case OPC_U4F8TRUNC:
01164 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
01165 c0 = Targ_Conv(MTYPE_U4, c0);
01166 break;
01167
01168 #ifdef TARG_NEEDS_QUAD_OPS
01169 case OPC_U4FQFLOOR:
01170 case OPC_U4FQTRUNC:
01171 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
01172 c0 = Targ_Conv(MTYPE_U4, c0);
01173 break;
01174 #endif
01175
01176 case OPC_U8F4FLOOR:
01177 case OPC_U8F4TRUNC:
01178 Is_True(TCON_ty(c0) == MTYPE_F4, ("Illegal operand to %s", OPCODE_name(op)));
01179 c0 = Targ_Conv(MTYPE_U8, c0);
01180 break;
01181
01182 case OPC_U8F8FLOOR:
01183 case OPC_U8F8TRUNC:
01184 Is_True(TCON_ty(c0) == MTYPE_F8, ("Illegal operand to %s", OPCODE_name(op)));
01185 c0 = Targ_Conv(MTYPE_U8, c0);
01186 break;
01187
01188 #ifdef TARG_NEEDS_QUAD_OPS
01189 case OPC_U8FQFLOOR:
01190 case OPC_U8FQTRUNC:
01191 Is_True(TCON_ty(c0) == MTYPE_FQ, ("Illegal operand to %s", OPCODE_name(op)));
01192 c0 = Targ_Conv(MTYPE_U8, c0);
01193 break;
01194 #endif
01195
01196 case OPC_U4F4CEIL:
01197 t1 = Targ_Conv(MTYPE_U4, c0);
01198 t2 = Targ_Conv(MTYPE_F4,t1);
01199 if (TCON_R4(t2) < TCON_R4(c0)) {
01200 TCON_U4(t1) += 1;
01201 }
01202 c0 = t1;
01203 break;
01204
01205 case OPC_U4F8CEIL:
01206 t1 = Targ_Conv(MTYPE_U4, c0);
01207 t2 = Targ_Conv(MTYPE_F8,t1);
01208 if (TCON_R8(t2) < TCON_R8(c0)) {
01209 TCON_U4(t1) += 1;
01210 }
01211 c0 = t1;
01212 break;
01213
01214 #ifdef TARG_NEEDS_QUAD_OPS
01215 case OPC_U4FQCEIL:
01216 t1 = Targ_Conv(MTYPE_U4, c0);
01217 t2 = Targ_Conv(MTYPE_FQ,t1);
01218 if (__c_q_lt(R16_To_RQ(TCON_R16(t2)),R16_To_RQ(TCON_R16(c0)),&err)) {
01219 TCON_U4(t1) += 1;
01220 }
01221 c0 = t1;
01222 break;
01223 #endif
01224
01225 case OPC_U8F4CEIL:
01226 t1 = Targ_Conv(MTYPE_U8, c0);
01227 t2 = Targ_Conv(MTYPE_F4,t1);
01228 if (TCON_R4(t2) < TCON_R4(c0)) {
01229 TCON_U8(t1) += 1;
01230 }
01231 c0 = t1;
01232 break;
01233
01234 case OPC_U8F8CEIL:
01235 t1 = Targ_Conv(MTYPE_U8, c0);
01236 t2 = Targ_Conv(MTYPE_F8,t1);
01237 if (TCON_R8(t2) < TCON_R8(c0)) {
01238 TCON_U8(t1) += 1;
01239 }
01240 c0 = t1;
01241 break;
01242
01243 #ifdef TARG_NEEDS_QUAD_OPS
01244 case OPC_U8FQCEIL:
01245 t1 = Targ_Conv(MTYPE_U8, c0);
01246 t2 = Targ_Conv(MTYPE_FQ,t1);
01247 if (__c_q_lt(R16_To_RQ(TCON_R16(t2)),R16_To_RQ(TCON_R16(c0)),&err)) {
01248 TCON_U8(t1) += 1;
01249 }
01250 c0 = t1;
01251 break;
01252 #endif
01253
01254 #ifdef TARG_NEEDS_QUAD_OPS
01255 case OPC_FQI4CVT:
01256 case OPC_FQU4CVT:
01257 case OPC_FQI8CVT:
01258 case OPC_FQU8CVT:
01259 c0 = Targ_Conv(OPCODE_rtype(op),Targ_Conv(OPCODE_desc(op),c0));
01260 break;
01261 #endif
01262 case OPC_F4I4CVT:
01263 case OPC_F8I4CVT:
01264 case OPC_F4U4CVT:
01265 case OPC_F8U4CVT:
01266 case OPC_F4I8CVT:
01267 case OPC_F8I8CVT:
01268 case OPC_F4U8CVT:
01269 case OPC_F8U8CVT:
01270 c0 = Targ_Conv(OPCODE_rtype(op),Targ_Conv(OPCODE_desc(op),c0));
01271 break;
01272
01273
01274
01275
01276 case OPC_I1TAS:
01277 case OPC_U1TAS:
01278 case OPC_I2TAS:
01279 case OPC_U2TAS:
01280 TCON_ty(c0) = OPCODE_rtype(op);
01281 break;
01282
01283
01284
01285
01286 case OPC_I8TAS:
01287 case OPC_U8TAS:
01288 case OPC_F8TAS:
01289 case OPC_FQTAS:
01290 TCON_ty(c0) = OPCODE_rtype(op);
01291 break;
01292
01293
01294 case OPC_U4TAS:
01295 case OPC_I4TAS:
01296
01297 if (TCON_ty(c0) == MTYPE_F4) {
01298 TCON_v0(c0) = TCON_v1(c0);
01299 TCON_v1(c0) = 0;
01300 }
01301 TCON_ty(c0) = OPCODE_rtype(op);
01302 break;
01303
01304 case OPC_F4TAS:
01305
01306 if (TCON_ty(c0) != MTYPE_F4) {
01307 TCON_v1(c0) = TCON_v0(c0);
01308 TCON_v0(c0) = 0;
01309 }
01310 TCON_ty(c0) = MTYPE_F4;
01311 break;
01312
01313
01314
01315 case OPC_C4TAS:
01316 TCON_ty(c0) = MTYPE_C4;
01317 break;
01318 case OPC_C8TAS:
01319 TCON_ty(c0) = MTYPE_C8;
01320 break;
01321 case OPC_CQTAS:
01322 TCON_ty(c0) = MTYPE_CQ;
01323 break;
01324
01325 case OPC_I8ABS:
01326 c0 = Targ_Conv(MTYPE_I8,c0);
01327 if (TCON_I8(c0) < 0) TCON_I8(c0) = -TCON_I8(c0);
01328 break;
01329 case OPC_I4ABS:
01330 c0 = Targ_Conv(MTYPE_I4,c0);
01331 if (TCON_I4(c0) < 0) TCON_I4(c0) = -TCON_I4(c0);
01332 break;
01333 case OPC_F4ABS:
01334 if (TCON_R4(c0) < 0) TCON_R4(c0) = -TCON_R4(c0);
01335 break;
01336 case OPC_F8ABS:
01337 if (TCON_R8(c0) < 0) TCON_R8(c0) = -TCON_R8(c0);
01338 break;
01339 #ifdef TARG_NEEDS_QUAD_OPS
01340 case OPC_FQABS:
01341 if (__c_q_lt(R16_To_RQ(TCON_R16(c0)),
01342 __c_q_flotj(0, &err),
01343 &err))
01344 TCON_R16(c0) = RQ_To_R16(__c_q_neg(R16_To_RQ(TCON_R16(c0)),
01345 &err));
01346 break;
01347 #endif
01348
01349 case OPC_I8NEG:
01350 c0 = Targ_Conv(MTYPE_I8,c0);
01351 TCON_I8(c0) = -TCON_I8(c0);
01352 break;
01353 case OPC_I4NEG:
01354 c0 = Targ_Conv(MTYPE_I4,c0);
01355 TCON_I4(c0) = -TCON_I4(c0);
01356 break;
01357 case OPC_U8NEG:
01358 c0 = Targ_Conv(MTYPE_U8,c0);
01359 TCON_U8(c0) = -TCON_U8(c0);
01360 break;
01361 case OPC_U4NEG:
01362 c0 = Targ_Conv(MTYPE_U4,c0);
01363 TCON_U4(c0) = -TCON_U4(c0);
01364 break;
01365 case OPC_F4NEG:
01366 TCON_R4(c0) = -TCON_R4(c0);
01367 break;
01368 case OPC_F8NEG:
01369 TCON_R8(c0) = -TCON_R8(c0);
01370 break;
01371 #ifdef TARG_NEEDS_QUAD_OPS
01372 case OPC_FQNEG:
01373 TCON_R16(c0) = RQ_To_R16(__c_q_neg(R16_To_RQ(TCON_R16(c0)),
01374 &err));
01375
01376 break;
01377 #endif
01378 case OPC_C4NEG:
01379 TCON_R4(c0) = -TCON_R4(c0);
01380 TCON_IR4(c0) = -TCON_IR4(c0);
01381 break;
01382 case OPC_C8NEG:
01383 TCON_R8(c0) = -TCON_R8(c0);
01384 TCON_IR8(c0) = -TCON_IR8(c0);
01385 break;
01386 #ifdef TARG_NEEDS_QUAD_OPS
01387 case OPC_CQNEG:
01388 TCON_R16(c0) = RQ_To_R16(__c_q_neg(R16_To_RQ(TCON_R16(c0)),
01389 &err));
01390 TCON_IR16(c0) = RQ_To_R16(__c_q_neg(R16_To_RQ(TCON_IR16(c0)),
01391 &err));
01392
01393 break;
01394 #endif
01395
01396 case OPC_BLAND:
01397 case OPC_I4LAND:
01398 case OPC_BCAND:
01399 case OPC_I4CAND:
01400 TCON_v0(c0) = TCON_U4(c0) && TCON_U4(c1);
01401 TCON_ty(c0) = LOGICAL_MTYPE;
01402 break;
01403
01404 case OPC_BLIOR:
01405 case OPC_I4LIOR:
01406 case OPC_BCIOR:
01407 case OPC_I4CIOR:
01408 TCON_v0(c0) = TCON_U4(c0) || TCON_U4(c1);
01409 TCON_ty(c0) = LOGICAL_MTYPE;
01410 break;
01411
01412 case OPC_BLNOT:
01413 case OPC_I4LNOT:
01414 switch (TCON_ty(c0)) {
01415 case MTYPE_I4:
01416 TCON_v0(c0) = (TCON_I4(c0) == 0);
01417 break;
01418 case MTYPE_U4:
01419 TCON_v0(c0) = (TCON_U4(c0) == 0);
01420 break;
01421 case MTYPE_I8:
01422 TCON_v0(c0) = (TCON_I8(c0) == 0);
01423 break;
01424 case MTYPE_U8:
01425 TCON_v0(c0) = (TCON_U8(c0) == 0);
01426 break;
01427 default:
01428 FmtAssert(0,("Targ_WhirlOp, illegal operand type for LNOT"));
01429 break;
01430 }
01431 TCON_ty(c0) = OPCODE_rtype(op);
01432 break;
01433
01434 case OPC_I8BXOR:
01435 BOTH_OPNDS(c0,c1,MTYPE_I8);
01436 TCON_I8(c0) ^= TCON_I8(c1);
01437 break;
01438 case OPC_I4BXOR:
01439 BOTH_OPNDS(c0,c1,MTYPE_I4);
01440 TCON_I4(c0) ^= TCON_I4(c1);
01441 break;
01442 case OPC_U8BXOR:
01443 BOTH_OPNDS(c0,c1,MTYPE_U8);
01444 TCON_U8(c0) ^= TCON_U8(c1);
01445 break;
01446 case OPC_U4BXOR:
01447 BOTH_OPNDS(c0,c1,MTYPE_U4);
01448 TCON_U4(c0) ^= TCON_U4(c1);
01449 break;
01450
01451 case OPC_I8BAND:
01452 BOTH_OPNDS(c0,c1,MTYPE_I8);
01453 TCON_I8(c0) &= TCON_I8(c1);
01454 break;
01455 case OPC_I4BAND:
01456 BOTH_OPNDS(c0,c1,MTYPE_I4);
01457 TCON_I4(c0) &= TCON_I4(c1);
01458 break;
01459 case OPC_U8BAND:
01460 BOTH_OPNDS(c0,c1,MTYPE_U8);
01461 TCON_U8(c0) &= TCON_U8(c1);
01462 break;
01463 case OPC_U4BAND:
01464 BOTH_OPNDS(c0,c1,MTYPE_U4);
01465 TCON_U4(c0) &= TCON_U4(c1);
01466 break;
01467
01468 case OPC_I8BIOR:
01469 BOTH_OPNDS(c0,c1,MTYPE_I8);
01470 TCON_I8(c0) |= TCON_I8(c1);
01471 break;
01472 case OPC_I4BIOR:
01473 BOTH_OPNDS(c0,c1,MTYPE_I4);
01474 TCON_I4(c0) |= TCON_I4(c1);
01475 break;
01476 case OPC_U8BIOR:
01477 BOTH_OPNDS(c0,c1,MTYPE_U8);
01478 TCON_U8(c0) |= TCON_U8(c1);
01479 break;
01480 case OPC_U4BIOR:
01481 BOTH_OPNDS(c0,c1,MTYPE_U4);
01482 TCON_U4(c0) |= TCON_U4(c1);
01483 break;
01484
01485 case OPC_I8BNOR:
01486 BOTH_OPNDS(c0,c1,MTYPE_I8);
01487 TCON_I8(c0) |= TCON_I8(c1);
01488 TCON_I8(c0) = ~TCON_I8(c0);
01489 break;
01490 case OPC_I4BNOR:
01491 BOTH_OPNDS(c0,c1,MTYPE_I4);
01492 TCON_I4(c0) |= TCON_I4(c1);
01493 TCON_I4(c0) = ~TCON_I4(c0);
01494 break;
01495 case OPC_U8BNOR:
01496 BOTH_OPNDS(c0,c1,MTYPE_U8);
01497 TCON_U8(c0) |= TCON_U8(c1);
01498 TCON_U8(c0) = ~TCON_U8(c0);
01499 break;
01500 case OPC_U4BNOR:
01501 BOTH_OPNDS(c0,c1,MTYPE_U4);
01502 TCON_U4(c0) |= TCON_U4(c1);
01503 TCON_U4(c0) = ~TCON_U4(c0);
01504 break;
01505
01506 case OPC_I8BNOT:
01507 c0 = Targ_Conv(MTYPE_I8,c0);
01508 TCON_I8(c0) = ~TCON_I8(c0);
01509 break;
01510 case OPC_I4BNOT:
01511 c0 = Targ_Conv(MTYPE_I4,c0);
01512 TCON_I4(c0) = ~TCON_I4(c0);
01513 break;
01514 case OPC_U8BNOT:
01515 c0 = Targ_Conv(MTYPE_U8,c0);
01516 TCON_U8(c0) = ~TCON_U8(c0);
01517 break;
01518 case OPC_U4BNOT:
01519 c0 = Targ_Conv(MTYPE_U4,c0);
01520 TCON_U4(c0) = ~TCON_U4(c0);
01521 break;
01522
01523
01524 case OPC_I8ADD:
01525 BOTH_OPNDS(c0,c1,MTYPE_I8);
01526 TCON_I8(c0) += TCON_I8(c1);
01527 break;
01528 case OPC_I4ADD:
01529 BOTH_OPNDS(c0,c1,MTYPE_I4);
01530 TCON_I4(c0) += TCON_I4(c1);
01531 break;
01532 case OPC_U8ADD:
01533 BOTH_OPNDS(c0,c1,MTYPE_U8);
01534 TCON_U8(c0) += TCON_U8(c1);
01535 break;
01536 case OPC_U4ADD:
01537 BOTH_OPNDS(c0,c1,MTYPE_U4);
01538 TCON_U4(c0) += TCON_U4(c1);
01539 break;
01540 case OPC_F4ADD:
01541 TCON_R4(c0) += TCON_R4(c1);
01542 break;
01543 case OPC_F8ADD:
01544 TCON_R8(c0) += TCON_R8(c1);
01545 break;
01546 #ifdef TARG_NEEDS_QUAD_OPS
01547 case OPC_FQADD:
01548
01549
01550 TCON_R16(c0) = RQ_To_R16(__c_q_add(R16_To_RQ(TCON_R16(c0)),
01551 R16_To_RQ(TCON_R16(c1)),
01552 &err));
01553
01554 break;
01555 #endif
01556 case OPC_C4ADD:
01557 TCON_R4(c0) += TCON_R4(c1);
01558 TCON_IR4(c0) += TCON_IR4(c1);
01559 break;
01560 case OPC_C8ADD:
01561 TCON_R8(c0) += TCON_R8(c1);
01562 TCON_IR8(c0) += TCON_IR8(c1);
01563 break;
01564 #ifdef TARG_NEEDS_QUAD_OPS
01565 case OPC_CQADD:
01566 TCON_R16(c0) = RQ_To_R16(__c_q_add(R16_To_RQ(TCON_R16(c0)),
01567 R16_To_RQ(TCON_R16(c1)),
01568 &err));
01569 TCON_IR16(c0) = RQ_To_R16(__c_q_add(R16_To_RQ(TCON_IR16(c0)),
01570 R16_To_RQ(TCON_IR16(c1)),
01571 &err));
01572
01573 break;
01574 #endif
01575
01576 case OPC_I8SUB:
01577 BOTH_OPNDS(c0,c1,MTYPE_I8);
01578 TCON_I8(c0) -= TCON_I8(c1);
01579 break;
01580 case OPC_I4SUB:
01581 BOTH_OPNDS(c0,c1,MTYPE_I4);
01582 TCON_I4(c0) -= TCON_I4(c1);
01583 break;
01584 case OPC_U8SUB:
01585 BOTH_OPNDS(c0,c1,MTYPE_U8);
01586 TCON_U8(c0) -= TCON_U8(c1);
01587 break;
01588 case OPC_U4SUB:
01589 BOTH_OPNDS(c0,c1,MTYPE_U4);
01590 TCON_U4(c0) -= TCON_U4(c1);
01591 break;
01592 case OPC_F4SUB:
01593 TCON_R4(c0) -= TCON_R4(c1);
01594 break;
01595 case OPC_F8SUB:
01596 TCON_R8(c0) -= TCON_R8(c1);
01597 break;
01598 #ifdef TARG_NEEDS_QUAD_OPS
01599 case OPC_FQSUB:
01600
01601
01602 TCON_R16(c0) = RQ_To_R16(__c_q_sub(R16_To_RQ(TCON_R16(c0)),
01603 R16_To_RQ(TCON_R16(c1)),
01604 &err));
01605
01606 break;
01607 #endif
01608 case OPC_C4SUB:
01609 TCON_R4(c0) -= TCON_R4(c1);
01610 TCON_IR4(c0) -= TCON_IR4(c1);
01611 break;
01612 case OPC_C8SUB:
01613 TCON_R8(c0) -= TCON_R8(c1);
01614 TCON_IR8(c0) -= TCON_IR8(c1);
01615 break;
01616 #ifdef TARG_NEEDS_QUAD_OPS
01617 case OPC_CQSUB:
01618
01619
01620 TCON_R16(c0) = RQ_To_R16(__c_q_sub(R16_To_RQ(TCON_R16(c0)),
01621 R16_To_RQ(TCON_R16(c1)),
01622 &err));
01623 TCON_IR16(c0) = RQ_To_R16(__c_q_sub(R16_To_RQ(TCON_IR16(c0)),
01624 R16_To_RQ(TCON_IR16(c1)),
01625 &err));
01626
01627 break;
01628 #endif
01629
01630 case OPC_F8SQRT:
01631 if (TCON_R8(c0) >= 0) {
01632 TCON_R8(c0) = sqrt(TCON_R8(c0));
01633 } else {
01634 *folded = FALSE;
01635 }
01636 break;
01637 case OPC_F4SQRT:
01638 if (TCON_R4(c0) >= 0) {
01639 TCON_R4(c0) = sqrtf(TCON_R4(c0));
01640 } else {
01641 *folded = FALSE;
01642 }
01643 break;
01644 #ifdef TARG_NEEDS_QUAD_OPS
01645 case OPC_FQSQRT:
01646 if (__c_q_ge(R16_To_RQ(TCON_R16(c0)),
01647 __c_q_flotj(0, &err),
01648 &err)) {
01649 TCON_R16(c0) = RQ_To_R16(__c_q_sqrt(R16_To_RQ(TCON_R16(c0)),
01650 &err));
01651 } else {
01652 *folded = FALSE;
01653 }
01654 break;
01655 #endif
01656 case OPC_C4SQRT:
01657 case OPC_C8SQRT:
01658 case OPC_CQSQRT:
01659 c0 = complex_sqrt(c0);
01660 break;
01661
01662 case OPC_I8MPY:
01663 BOTH_OPNDS(c0,c1,MTYPE_I8);
01664 TCON_I8(c0) *= TCON_I8(c1);
01665 break;
01666 case OPC_I4MPY:
01667 BOTH_OPNDS(c0,c1,MTYPE_I4);
01668 TCON_I4(c0) *= TCON_I4(c1);
01669 break;
01670 case OPC_U8MPY:
01671 BOTH_OPNDS(c0,c1,MTYPE_U8);
01672 TCON_U8(c0) *= TCON_U8(c1);
01673 break;
01674 case OPC_U4MPY:
01675 BOTH_OPNDS(c0,c1,MTYPE_U4);
01676 TCON_U4(c0) *= TCON_U4(c1);
01677 break;
01678 case OPC_F4MPY:
01679 TCON_R4(c0) *= TCON_R4(c1);
01680 break;
01681 case OPC_F8MPY:
01682 TCON_R8(c0) *= TCON_R8(c1);
01683 break;
01684
01685 #ifdef TARG_NEEDS_QUAD_OPS
01686 case OPC_FQMPY:
01687
01688
01689 TCON_R16(c0) = RQ_To_R16(__c_q_mul(R16_To_RQ(TCON_R16(c0)),
01690 R16_To_RQ(TCON_R16(c1)),
01691 &err));
01692
01693 break;
01694 #endif
01695
01696 case OPC_C4MPY:
01697 TCON_R4(t1) = TCON_R4(c0)*TCON_R4(c1) - TCON_IR4(c0)*TCON_IR4(c1);
01698 TCON_IR4(c0) = TCON_R4(c0)*TCON_IR4(c1) + TCON_IR4(c0)*TCON_R4(c1);
01699 TCON_R4(c0) = TCON_R4(t1);
01700 break;
01701 case OPC_C8MPY:
01702 TCON_R8(t1) = TCON_R8(c0)*TCON_R8(c1) - TCON_IR8(c0)*TCON_IR8(c1);
01703 TCON_IR8(c0) = TCON_R8(c0)*TCON_IR8(c1) + TCON_IR8(c0)*TCON_R8(c1);
01704 TCON_R8(c0) = TCON_R8(t1);
01705 break;
01706
01707 #ifdef TARG_NEEDS_QUAD_OPS
01708 case OPC_CQMPY:
01709 {
01710 QUAD a,b,c,d,r1,r2,r3;
01711 a = R16_To_RQ(TCON_R16(c0));
01712 b = R16_To_RQ(TCON_IR16(c0));
01713 c = R16_To_RQ(TCON_R16(c1));
01714 d = R16_To_RQ(TCON_IR16(c1));
01715 r1 = __c_q_mul(a,c,&err);
01716 r2 = __c_q_mul(b,d,&err);
01717 r3 = __c_q_sub(r1,r2,&err);
01718 r1 = __c_q_mul(a,d,&err);
01719 r2 = __c_q_mul(b,c,&err);
01720 r1 = __c_q_add(r1,r2,&err);
01721 TCON_R16(c0) = RQ_To_R16(r3);
01722 TCON_IR16(c0) = RQ_To_R16(r1);
01723 }
01724 break;
01725 #endif
01726
01727 case OPC_I8DIV:
01728 BOTH_OPNDS(c0,c1,MTYPE_I8);
01729 if (TCON_I8(c1) != 0) {
01730
01731 if ( TCON_I8(c1) != -1 || TCON_I8(c0) != MIN_INT_I8 )
01732 TCON_I8(c0) /= TCON_I8(c1);
01733 else {
01734
01735 *folded = FALSE;
01736
01737 }
01738 }
01739 else {
01740
01741
01742 *folded = FALSE;
01743 }
01744 break;
01745 case OPC_I4DIV:
01746 BOTH_OPNDS(c0,c1,MTYPE_I4);
01747 if (TCON_I4(c1) != 0) {
01748
01749 if ( TCON_I4(c1) != -1 || TCON_I4(c0) != MIN_INT_I4 )
01750 TCON_I4(c0) /= TCON_I4(c1);
01751 else {
01752 *folded = FALSE;
01753
01754 }
01755 }
01756 else {
01757
01758
01759 *folded = FALSE;
01760 }
01761 break;
01762 case OPC_U8DIV:
01763 BOTH_OPNDS(c0,c1,MTYPE_U8);
01764 if (TCON_U8(c1) != 0)
01765 TCON_U8(c0) /= TCON_U8(c1);
01766 else {
01767
01768
01769 *folded = FALSE;
01770 }
01771 break;
01772 case OPC_U4DIV:
01773 BOTH_OPNDS(c0,c1,MTYPE_U4);
01774 if (TCON_U4(c1) != 0)
01775 TCON_U4(c0) /= TCON_U4(c1);
01776 else {
01777
01778
01779 *folded = FALSE;
01780 }
01781 break;
01782 case OPC_F4DIV:
01783 if (TCON_R4(c1) == 0.0) {
01784
01785
01786 *folded = FALSE;
01787 }
01788 TCON_R4(c0) /= TCON_R4(c1);
01789 break;
01790 case OPC_F8DIV:
01791 if (TCON_R8(c1) == 0.0) {
01792
01793
01794 *folded = FALSE;
01795 }
01796 TCON_R8(c0) /= TCON_R8(c1);
01797 break;
01798 #ifdef TARG_NEEDS_QUAD_OPS
01799 case OPC_FQDIV:
01800
01801
01802 if (__c_q_eq(R16_To_RQ(TCON_R16(c1)),
01803 __c_q_flotj(0, &err),
01804 &err)) {
01805
01806
01807 *folded = FALSE;
01808
01809 }
01810 TCON_R16(c0) = RQ_To_R16(__c_q_div(R16_To_RQ(TCON_R16(c0)),
01811 R16_To_RQ(TCON_R16(c1)),
01812 &err));
01813
01814 break;
01815 #endif
01816
01817 case OPC_C8DIV:
01818 case OPC_CQDIV:
01819 case OPC_C4DIV:
01820 c0 = complex_divide(c0,c1);
01821 break;
01822
01823 case OPC_I8REM:
01824 BOTH_OPNDS(c0,c1,MTYPE_I8);
01825 if (TCON_I8(c1) != 0) {
01826
01827 if ( TCON_I8(c1) != -1 || TCON_I8(c0) != MIN_INT_I8 )
01828 TCON_I8(c0) %= TCON_I8(c1);
01829 else {
01830
01831 *folded = FALSE;
01832 }
01833 }
01834 else {
01835
01836
01837 *folded = FALSE;
01838 }
01839 break;
01840 case OPC_I4REM:
01841 BOTH_OPNDS(c0,c1,MTYPE_I4);
01842 if (TCON_I4(c1) != 0) {
01843
01844 if ( TCON_I4(c1) != -1 || TCON_I4(c0) != MIN_INT_I4 )
01845 TCON_I4(c0) %= TCON_I4(c1);
01846 else {
01847
01848 *folded = FALSE;
01849 }
01850 }
01851 else {
01852
01853
01854 *folded = FALSE;
01855 }
01856 break;
01857 case OPC_U8REM:
01858 BOTH_OPNDS(c0,c1,MTYPE_U8);
01859 if (TCON_U8(c1) != 0)
01860 TCON_U8(c0) %= TCON_U8(c1);
01861 else {
01862
01863
01864 *folded = FALSE;
01865 }
01866 break;
01867 case OPC_U4REM:
01868 BOTH_OPNDS(c0,c1,MTYPE_U4);
01869 if (TCON_U4(c1) != 0)
01870 TCON_U4(c0) %= TCON_U4(c1);
01871 else {
01872
01873
01874 *folded = FALSE;
01875 }
01876 break;
01877
01878 case OPC_I8MOD:
01879 BOTH_OPNDS(c0,c1,MTYPE_I8);
01880 if (TCON_I8(c1) != 0) {
01881
01882 if ( TCON_I8(c1) != -1 || TCON_I8(c0) != MIN_INT_I8 ) {
01883 INT64 rem = TCON_I8(c0) % TCON_I8(c1);
01884 if ( rem != 0 && ( (TCON_I8(c0)>0) ^ (TCON_I8(c1)>0) ) )
01885 rem += TCON_I8(c1);
01886 TCON_I8(c0) = rem;
01887 }
01888 else {
01889
01890 *folded = FALSE;
01891 }
01892 } else {
01893
01894
01895 *folded = FALSE;
01896 }
01897 break;
01898 case OPC_I4MOD:
01899 BOTH_OPNDS(c0,c1,MTYPE_I4);
01900 if (TCON_I4(c1) != 0) {
01901
01902 if ( TCON_I4(c1) != -1 || TCON_I4(c0) != MIN_INT_I4 ) {
01903 INT32 rem = TCON_I4(c0) % TCON_I4(c1);
01904 if ( rem != 0 && ( (TCON_I4(c0)>0) ^ (TCON_I4(c1)>0) ) )
01905 rem += TCON_I4(c1);
01906 TCON_I4(c0) = rem;
01907 }
01908 else {
01909
01910 *folded = FALSE;
01911 }
01912 } else {
01913
01914
01915 *folded = FALSE;
01916 }
01917 break;
01918 case OPC_U8MOD:
01919 BOTH_OPNDS(c0,c1,MTYPE_U8);
01920 if (TCON_U8(c1) != 0)
01921 TCON_U8(c0) %= TCON_U8(c1);
01922 else {
01923
01924
01925 *folded = FALSE;
01926 }
01927 break;
01928 case OPC_U4MOD:
01929 BOTH_OPNDS(c0,c1,MTYPE_U4);
01930 if (TCON_U4(c1) != 0)
01931 TCON_U4(c0) %= TCON_U4(c1);
01932 else {
01933
01934
01935 *folded = FALSE;
01936 }
01937 break;
01938
01939
01940 case OPC_F4RECIP:
01941 c0 = Targ_WhirlOp(OPC_F4DIV,Host_To_Targ_Float(MTYPE_F4,1.0),c0,folded);
01942 break;
01943 case OPC_F8RECIP:
01944 c0 = Targ_WhirlOp(OPC_F8DIV,Host_To_Targ_Float(MTYPE_F8,1.0),c0,folded);
01945 break;
01946 case OPC_FQRECIP:
01947 c0 = Targ_WhirlOp(OPC_FQDIV,Host_To_Targ_Float(MTYPE_FQ,1.0),c0,folded);
01948 break;
01949 case OPC_C4RECIP:
01950 c0 = Targ_WhirlOp(OPC_C4DIV,Host_To_Targ_Float(MTYPE_C4,1.0),c0,folded);
01951 break;
01952 case OPC_C8RECIP:
01953 c0 = Targ_WhirlOp(OPC_C8DIV,Host_To_Targ_Float(MTYPE_C8,1.0),c0,folded);
01954 break;
01955 case OPC_CQRECIP:
01956 c0 = Targ_WhirlOp(OPC_CQDIV,Host_To_Targ_Float(MTYPE_CQ,1.0),c0,folded);
01957 break;
01958
01959 case OPC_F4RSQRT:
01960 c0 = Targ_WhirlOp(OPC_F4SQRT,c0,c0,folded);
01961 if (*folded) c0 = Targ_WhirlOp(OPC_F4DIV,Host_To_Targ_Float(MTYPE_F4,1.0),c0,folded);
01962 break;
01963 case OPC_F8RSQRT:
01964 c0 = Targ_WhirlOp(OPC_F8SQRT,c0,c0,folded);
01965 if (*folded) c0 = Targ_WhirlOp(OPC_F8DIV,Host_To_Targ_Float(MTYPE_F8,1.0),c0,folded);
01966 break;
01967 case OPC_FQRSQRT:
01968 c0 = Targ_WhirlOp(OPC_FQSQRT,c0,c0,folded);
01969 if (*folded) c0 = Targ_WhirlOp(OPC_FQDIV,Host_To_Targ_Float(MTYPE_FQ,1.0),c0,folded);
01970 break;
01971 case OPC_C4RSQRT:
01972 c0 = Targ_WhirlOp(OPC_C4SQRT,c0,c0,folded);
01973 if (*folded) c0 = Targ_WhirlOp(OPC_C4DIV,Host_To_Targ_Float(MTYPE_C4,1.0),c0,folded);
01974 break;
01975 case OPC_C8RSQRT:
01976 c0 = Targ_WhirlOp(OPC_C8SQRT,c0,c0,folded);
01977 if (*folded) c0 = Targ_WhirlOp(OPC_C8DIV,Host_To_Targ_Float(MTYPE_C8,1.0),c0,folded);
01978 break;
01979 case OPC_CQRSQRT:
01980 c0 = Targ_WhirlOp(OPC_CQSQRT,c0,c0,folded);
01981 if (*folded) c0 = Targ_WhirlOp(OPC_CQDIV,Host_To_Targ_Float(MTYPE_CQ,1.0),c0,folded);
01982 break;
01983
01984 case OPC_I8MIN:
01985 BOTH_OPNDS(c0,c1,MTYPE_I8);
01986 TCON_I8(c0) = TCON_I8(c0)<=TCON_I8(c1)? TCON_I8(c0) : TCON_I8(c1);
01987 break;
01988 case OPC_I4MIN:
01989 BOTH_OPNDS(c0,c1,MTYPE_I4);
01990 TCON_I4(c0) = TCON_I4(c0)<=TCON_I4(c1)? TCON_I4(c0) : TCON_I4(c1);
01991 break;
01992 case OPC_U8MIN:
01993 BOTH_OPNDS(c0,c1,MTYPE_U8);
01994 TCON_U8(c0) = TCON_U8(c0)<=TCON_U8(c1)? TCON_U8(c0) : TCON_U8(c1);
01995 break;
01996 case OPC_U4MIN:
01997 BOTH_OPNDS(c0,c1,MTYPE_U4);
01998 TCON_U4(c0) = TCON_U4(c0)<=TCON_U4(c1)? TCON_U4(c0) : TCON_U4(c1);
01999 break;
02000
02001 case OPC_I8MAX:
02002 BOTH_OPNDS(c0,c1,MTYPE_I8);
02003 TCON_I8(c0) = TCON_I8(c0)>=TCON_I8(c1)? TCON_I8(c0) : TCON_I8(c1);
02004 break;
02005 case OPC_I4MAX:
02006 BOTH_OPNDS(c0,c1,MTYPE_I4);
02007 TCON_I4(c0) = TCON_I4(c0)>=TCON_I4(c1)? TCON_I4(c0) : TCON_I4(c1);
02008 break;
02009 case OPC_U8MAX:
02010 BOTH_OPNDS(c0,c1,MTYPE_U8);
02011 TCON_U8(c0) = TCON_U8(c0)>=TCON_U8(c1)? TCON_U8(c0) : TCON_U8(c1);
02012 break;
02013 case OPC_U4MAX:
02014 BOTH_OPNDS(c0,c1,MTYPE_U4);
02015 TCON_U4(c0) = TCON_U4(c0)>=TCON_U4(c1)? TCON_U4(c0) : TCON_U4(c1);
02016 break;
02017
02018 case OPC_F4MIN:
02019 TCON_R4(c0) = TCON_R4(c0) < TCON_R4(c1) ?
02020 TCON_R4(c0) : TCON_R4(c1);
02021 break;
02022 case OPC_F4MAX:
02023 TCON_R4(c0) = TCON_R4(c0) < TCON_R4(c1) ?
02024 TCON_R4(c1) : TCON_R4(c0);
02025 break;
02026 case OPC_F8MIN:
02027 TCON_R8(c0) = TCON_R8(c0) < TCON_R8(c1) ?
02028 TCON_R8(c0) : TCON_R8(c1);
02029 break;
02030 case OPC_F8MAX:
02031 TCON_R8(c0) = TCON_R8(c0) < TCON_R8(c1) ?
02032 TCON_R8(c1) : TCON_R8(c0);
02033 break;
02034
02035 #ifdef TARG_NEEDS_QUAD_OPS
02036 case OPC_FQMIN:
02037
02038
02039 TCON_R16(c0) = __c_q_lt(R16_To_RQ(TCON_R16(c0)),
02040 R16_To_RQ(TCON_R16(c1)), &err) ?
02041 TCON_R16(c0) : TCON_R16(c1);
02042
02043 break;
02044
02045 case OPC_FQMAX:
02046
02047
02048 TCON_R16(c0) = __c_q_lt(R16_To_RQ(TCON_R16(c0)),
02049 R16_To_RQ(TCON_R16(c1)), &err) ?
02050 TCON_R16(c1) : TCON_R16(c0);
02051
02052 break;
02053 #endif
02054
02055
02056 case OPC_C4COMPLEX:
02057 TCON_IR4(c0) = TCON_R4(c1);
02058 TCON_ty(c0) = MTYPE_C4;
02059 break;
02060 case OPC_C8COMPLEX:
02061 TCON_IR8(c0) = TCON_R8(c1);
02062 TCON_ty(c0) = MTYPE_C8;
02063 break;
02064 case OPC_CQCOMPLEX:
02065 TCON_IR16(c0) = TCON_R16(c1);
02066 TCON_ty(c0) = MTYPE_CQ;
02067 break;
02068
02069
02070 case OPC_F4REALPART:
02071 TCON_ty(c0) = MTYPE_F4;
02072 break;
02073 case OPC_F8REALPART:
02074 TCON_ty(c0) = MTYPE_F8;
02075 break;
02076 case OPC_FQREALPART:
02077 TCON_ty(c0) = MTYPE_FQ;
02078 break;
02079
02080
02081 case OPC_F4IMAGPART:
02082 TCON_R4(c0) = TCON_IR4(c0);
02083 TCON_ty(c0) = MTYPE_F4;
02084 break;
02085 case OPC_F8IMAGPART:
02086 TCON_R8(c0) = TCON_IR8(c0);
02087 TCON_ty(c0) = MTYPE_F8;
02088 break;
02089 case OPC_FQIMAGPART:
02090 TCON_R16(c0) = TCON_IR16(c0);
02091 TCON_ty(c0) = MTYPE_FQ;
02092 break;
02093
02094 default:
02095 FmtAssert ( folded, ("Targ_WhirlOp can not handle %s", OPCODE_name(op)) );
02096 *folded = FALSE;
02097 break;
02098 }
02099 #ifdef DEBUG_FOLD
02100 printf(" 0x%llx (%s)\n",TCON_I8(c0),Mtype_Name(TCON_ty(c0)));
02101 #endif
02102
02103 return c0;
02104 }
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116 TCON
02117 Targ_Conv ( TYPE_ID ty_to, TCON c )
02118 {
02119 TYPE_ID ty_from;
02120 TCON r;
02121 #ifdef TARG_NEEDS_QUAD_OPS
02122 INT32 err;
02123 #endif
02124
02125 #define FROM_TO(type_from, type_to) (type_from)*(MTYPE_LAST+1)+(type_to)
02126
02127 r = MTYPE_size_min(ty_to) <= 32 ? Zero_I4_Tcon : Zero_I8_Tcon;
02128 TCON_v0(r) = 0;
02129 TCON_v1(r) = 0;
02130 TCON_v2(r) = 0;
02131 TCON_v3(r) = 0;
02132 TCON_iv0(r) = 0;
02133 TCON_iv1(r) = 0;
02134 TCON_iv2(r) = 0;
02135 TCON_iv3(r) = 0;
02136 ty_from = TCON_ty(c);
02137 Is_True ( ty_to > MTYPE_UNKNOWN && ty_to <= MTYPE_LAST,
02138 ("Bad dest type in Targ_Conv: %s", Mtype_Name(ty_to)) );
02139 Is_True ( ty_from > MTYPE_UNKNOWN && ty_from <= MTYPE_LAST,
02140 ("Bad dest type in Targ_Conv: %s", Mtype_Name(ty_from)) );
02141
02142 if (ty_from == ty_to)
02143 return c;
02144
02145
02146
02147 switch ( FROM_TO(ty_from, ty_to) ) {
02148 #ifdef TARG_NEEDS_QUAD_OPS
02149 case FROM_TO(MTYPE_C8, MTYPE_CQ):
02150 TCON_R16(r) = RQ_To_R16(__c_q_extd(TCON_R8(c), &err));
02151 TCON_IR16(r) = RQ_To_R16(__c_q_extd(TCON_IR8(c), &err));
02152 break;
02153 case FROM_TO(MTYPE_C4, MTYPE_CQ):
02154 TCON_R16(r) = RQ_To_R16(__c_q_ext(TCON_R4(c), &err));
02155 TCON_IR16(r) = RQ_To_R16(__c_q_ext(TCON_IR4(c), &err));
02156 break;
02157 case FROM_TO(MTYPE_FQ, MTYPE_CQ):
02158 TCON_R16(r) = TCON_R16(c);
02159 TCON_IR16(r) = RQ_To_R16(__c_q_ext(0.0, &err));
02160 break;
02161 case FROM_TO(MTYPE_F8, MTYPE_CQ):
02162 TCON_R16(r) = RQ_To_R16(__c_q_extd(TCON_R8(c), &err));
02163 TCON_IR16(r) = RQ_To_R16(__c_q_ext(0.0, &err));
02164 break;
02165 case FROM_TO(MTYPE_F4, MTYPE_CQ):
02166 TCON_R16(r) = RQ_To_R16(__c_q_ext(TCON_R4(c), &err));
02167 TCON_IR16(r) = RQ_To_R16(__c_q_ext(0.0, &err));
02168 break;
02169 case FROM_TO(MTYPE_I8, MTYPE_CQ):
02170 TCON_R16(r) = RQ_To_R16(__c_q_flotk(TCON_I8(c), &err));
02171 TCON_IR16(r) = RQ_To_R16(__c_q_ext(0.0, &err));
02172 break;
02173 case FROM_TO(MTYPE_I4, MTYPE_CQ):
02174 case FROM_TO(MTYPE_I2, MTYPE_CQ):
02175 case FROM_TO(MTYPE_I1, MTYPE_CQ):
02176 TCON_R16(r) = RQ_To_R16(__c_q_flotj(TCON_v0(c), &err));
02177 TCON_IR16(r) = RQ_To_R16(__c_q_ext(0.0, &err));
02178 break;
02179 case FROM_TO(MTYPE_U8, MTYPE_CQ):
02180 TCON_R16(r) = RQ_To_R16(__c_q_flotku(TCON_U8(c), &err));
02181 TCON_IR16(r) = RQ_To_R16(__c_q_ext(0.0, &err));
02182 break;
02183 case FROM_TO(MTYPE_U4, MTYPE_CQ):
02184 case FROM_TO(MTYPE_U2, MTYPE_CQ):
02185 case FROM_TO(MTYPE_U1, MTYPE_CQ):
02186 TCON_R16(r) = RQ_To_R16(__c_q_flotju(TCON_u0(c), &err));
02187 TCON_IR16(r) = RQ_To_R16(__c_q_ext(0.0, &err));
02188 break;
02189 #endif
02190
02191 #ifdef TARG_NEEDS_QUAD_OPS
02192 case FROM_TO(MTYPE_CQ, MTYPE_C8):
02193 TCON_R8(r) = __c_dble_q(R16_To_RQ(TCON_R16(c)), &err);
02194 TCON_IR8(r) = __c_dble_q(R16_To_RQ(TCON_IR16(c)), &err);
02195 break;
02196 #endif
02197 case FROM_TO(MTYPE_C4, MTYPE_C8):
02198 TCON_R8(r) = TCON_R4(c);
02199 TCON_IR8(r) = TCON_IR4(c);
02200 break;
02201 #ifdef TARG_NEEDS_QUAD_OPS
02202 case FROM_TO(MTYPE_FQ, MTYPE_C8):
02203 TCON_R8(r) = __c_dble_q(R16_To_RQ(TCON_R16(c)), &err);
02204 TCON_IR8(r) = 0.0;
02205 break;
02206 #endif
02207 case FROM_TO(MTYPE_F8, MTYPE_C8):
02208 TCON_R8(r) = TCON_R8(c);
02209 TCON_IR8(r) = 0.0;
02210 break;
02211 case FROM_TO(MTYPE_F4, MTYPE_C8):
02212 TCON_R8(r) = TCON_R4(c);
02213 TCON_IR8(r) = 0.0;
02214 break;
02215 case FROM_TO(MTYPE_I8, MTYPE_C8):
02216 TCON_R8(r) = TCON_I8(c);
02217 TCON_IR8(r) = 0.0;
02218 break;
02219 case FROM_TO(MTYPE_I4, MTYPE_C8):
02220 case FROM_TO(MTYPE_I2, MTYPE_C8):
02221 case FROM_TO(MTYPE_I1, MTYPE_C8):
02222 TCON_R8(r) = TCON_v0(c);
02223 TCON_IR8(r) = 0.0;
02224 break;
02225 case FROM_TO(MTYPE_U8, MTYPE_C8):
02226 TCON_R8(r) = TCON_U8(c);
02227 TCON_IR8(r) = 0.0;
02228 break;
02229 case FROM_TO(MTYPE_U4, MTYPE_C8):
02230 case FROM_TO(MTYPE_U2, MTYPE_C8):
02231 case FROM_TO(MTYPE_U1, MTYPE_C8):
02232 TCON_R8(r) = TCON_u0(c);
02233 TCON_IR8(r) = 0.0;
02234 break;
02235
02236 #ifdef TARG_NEEDS_QUAD_OPS
02237 case FROM_TO(MTYPE_CQ, MTYPE_C4):
02238 Set_TCON_R4(r, __c_sngl_q(R16_To_RQ(TCON_R16(c)), &err));
02239 Set_TCON_IR4(r, __c_sngl_q(R16_To_RQ(TCON_IR16(c)), &err));
02240 break;
02241 #endif
02242 case FROM_TO(MTYPE_C8, MTYPE_C4):
02243 TCON_R4(r) = TCON_R8(c);
02244 TCON_IR4(r) = TCON_IR8(c);
02245 break;
02246 #ifdef TARG_NEEDS_QUAD_OPS
02247 case FROM_TO(MTYPE_FQ, MTYPE_C4):
02248 Set_TCON_R4(r, __c_sngl_q(R16_To_RQ(TCON_R16(c)), &err));
02249 TCON_IR4(r) = 0.0;
02250 break;
02251 #endif
02252 case FROM_TO(MTYPE_F8, MTYPE_C4):
02253 TCON_R4(r) = TCON_R8(c);
02254 TCON_IR4(r) = 0.0;
02255 break;
02256 case FROM_TO(MTYPE_F4, MTYPE_C4):
02257 TCON_R4(r) = TCON_R4(c);
02258 TCON_IR4(r) = 0.0;
02259 break;
02260 case FROM_TO(MTYPE_I8, MTYPE_C4):
02261 TCON_R4(r) = TCON_I8(c);
02262 TCON_IR4(r) = 0.0;
02263 break;
02264 case FROM_TO(MTYPE_I4, MTYPE_C4):
02265 case FROM_TO(MTYPE_I2, MTYPE_C4):
02266 case FROM_TO(MTYPE_I1, MTYPE_C4):
02267 TCON_R4(r) = TCON_v0(c);
02268 TCON_IR4(r) = 0.0;
02269 break;
02270 case FROM_TO(MTYPE_U8, MTYPE_C4):
02271 TCON_R4(r) = TCON_U8(c);
02272 TCON_IR4(r) = 0.0;
02273 break;
02274 case FROM_TO(MTYPE_U4, MTYPE_C4):
02275 case FROM_TO(MTYPE_U2, MTYPE_C4):
02276 case FROM_TO(MTYPE_U1, MTYPE_C4):
02277 TCON_R4(r) = TCON_u0(c);
02278 TCON_IR4(r) = 0.0;
02279 break;
02280
02281 #ifdef TARG_NEEDS_QUAD_OPS
02282 case FROM_TO(MTYPE_CQ, MTYPE_FQ):
02283 TCON_R16(r) = TCON_R16(c);
02284 break;
02285 case FROM_TO(MTYPE_C8, MTYPE_FQ):
02286 TCON_R16(r) = RQ_To_R16(__c_q_extd(TCON_R8(c), &err));
02287 break;
02288 case FROM_TO(MTYPE_C4, MTYPE_FQ):
02289 TCON_R16(r) = RQ_To_R16(__c_q_ext(TCON_R4(c), &err));
02290 break;
02291 case FROM_TO(MTYPE_F8, MTYPE_FQ):
02292 TCON_R16(r) = RQ_To_R16(__c_q_extd(TCON_R8(c), &err));
02293 break;
02294 case FROM_TO(MTYPE_F4, MTYPE_FQ):
02295 TCON_R16(r) = RQ_To_R16(__c_q_ext(TCON_R4(c), &err));
02296 break;
02297 case FROM_TO(MTYPE_I8, MTYPE_FQ):
02298 TCON_R16(r) = RQ_To_R16(__c_q_flotk(TCON_I8(c), &err));
02299 break;
02300 case FROM_TO(MTYPE_I4, MTYPE_FQ):
02301 case FROM_TO(MTYPE_I2, MTYPE_FQ):
02302 case FROM_TO(MTYPE_I1, MTYPE_FQ):
02303 TCON_R16(r) = RQ_To_R16(__c_q_flotj(TCON_v0(c), &err));
02304 break;
02305 case FROM_TO(MTYPE_U8, MTYPE_FQ):
02306 TCON_R16(r) = RQ_To_R16(__c_q_flotku(TCON_U8(c), &err));
02307 break;
02308 case FROM_TO(MTYPE_U4, MTYPE_FQ):
02309 case FROM_TO(MTYPE_U2, MTYPE_FQ):
02310 case FROM_TO(MTYPE_U1, MTYPE_FQ):
02311 TCON_R16(r) = RQ_To_R16(__c_q_flotju(TCON_u0(c), &err));
02312 break;
02313 #endif
02314
02315 #ifdef TARG_NEEDS_QUAD_OPS
02316 case FROM_TO(MTYPE_CQ, MTYPE_F8):
02317 TCON_R8(r) = __c_dble_q(R16_To_RQ(TCON_R16(c)), &err);
02318 break;
02319 #endif
02320 case FROM_TO(MTYPE_C8, MTYPE_F8):
02321 TCON_R8(r) = TCON_R8(c);
02322 break;
02323 case FROM_TO(MTYPE_C4, MTYPE_F8):
02324 TCON_R8(r) = TCON_R4(c);
02325 break;
02326 #ifdef TARG_NEEDS_QUAD_OPS
02327 case FROM_TO(MTYPE_FQ, MTYPE_F8):
02328 TCON_R8(r) = __c_dble_q(R16_To_RQ(TCON_R16(c)), &err);
02329 break;
02330 #endif
02331 case FROM_TO(MTYPE_F4, MTYPE_F8):
02332 TCON_R8(r) = TCON_R4(c);
02333 break;
02334 case FROM_TO(MTYPE_I8, MTYPE_F8):
02335 TCON_R8(r) = TCON_I8(c);
02336 break;
02337 case FROM_TO(MTYPE_I4, MTYPE_F8):
02338 case FROM_TO(MTYPE_I2, MTYPE_F8):
02339 case FROM_TO(MTYPE_I1, MTYPE_F8):
02340 TCON_R8(r) = TCON_v0(c);
02341 break;
02342 case FROM_TO(MTYPE_U8, MTYPE_F8):
02343 TCON_R8(r) = TCON_U8(c);
02344 break;
02345 case FROM_TO(MTYPE_U4, MTYPE_F8):
02346 case FROM_TO(MTYPE_U2, MTYPE_F8):
02347 case FROM_TO(MTYPE_U1, MTYPE_F8):
02348 TCON_R8(r) = TCON_u0(c);
02349 break;
02350
02351 #ifdef TARG_NEEDS_QUAD_OPS
02352 case FROM_TO(MTYPE_CQ, MTYPE_F4):
02353 Set_TCON_R4(r, __c_sngl_q(R16_To_RQ(TCON_R16(c)), &err));
02354 break;
02355 #endif
02356 case FROM_TO(MTYPE_C8, MTYPE_F4):
02357 TCON_R4(r) = TCON_R8(c);
02358 break;
02359 case FROM_TO(MTYPE_C4, MTYPE_F4):
02360 TCON_R4(r) = TCON_R4(c);
02361 break;
02362 #ifdef TARG_NEEDS_QUAD_OPS
02363 case FROM_TO(MTYPE_FQ, MTYPE_F4):
02364 Set_TCON_R4(r, __c_sngl_q(R16_To_RQ(TCON_R16(c)), &err));
02365 break;
02366 #endif
02367 case FROM_TO(MTYPE_F8, MTYPE_F4):
02368 TCON_R4(r) = TCON_R8(c);
02369 break;
02370 case FROM_TO(MTYPE_I8, MTYPE_F4):
02371 TCON_R4(r) = TCON_I8(c);
02372 break;
02373 case FROM_TO(MTYPE_I4, MTYPE_F4):
02374 case FROM_TO(MTYPE_I2, MTYPE_F4):
02375 case FROM_TO(MTYPE_I1, MTYPE_F4):
02376 TCON_R4(r) = TCON_v0(c);
02377 break;
02378 case FROM_TO(MTYPE_U8, MTYPE_F4):
02379 TCON_R4(r) = TCON_U8(c);
02380 break;
02381 case FROM_TO(MTYPE_U4, MTYPE_F4):
02382 case FROM_TO(MTYPE_U2, MTYPE_F4):
02383 case FROM_TO(MTYPE_U1, MTYPE_F4):
02384 TCON_R4(r) = TCON_u0(c);
02385 break;
02386
02387 #ifdef TARG_NEEDS_QUAD_OPS
02388 case FROM_TO(MTYPE_CQ, MTYPE_I8):
02389 TCON_I8(r) = __c_ki_qint(R16_To_RQ(TCON_R16(c)), &err);
02390 break;
02391 #endif
02392 case FROM_TO(MTYPE_C8, MTYPE_I8):
02393 TCON_I8(r) = (INT64)TCON_R8(c);
02394 break;
02395 case FROM_TO(MTYPE_C4, MTYPE_I8):
02396 TCON_I8(r) = (INT64)TCON_R4(c);
02397 break;
02398 #ifdef TARG_NEEDS_QUAD_OPS
02399 case FROM_TO(MTYPE_FQ, MTYPE_I8):
02400 TCON_I8(r) = __c_ki_qint(R16_To_RQ(TCON_R16(c)), &err);
02401 break;
02402 #endif
02403 case FROM_TO(MTYPE_F8, MTYPE_I8):
02404 TCON_I8(r) = (INT64)TCON_R8(c);
02405 break;
02406 case FROM_TO(MTYPE_F4, MTYPE_I8):
02407 TCON_I8(r) = (INT64)TCON_R4(c);
02408 break;
02409 case FROM_TO(MTYPE_I4, MTYPE_I8):
02410 case FROM_TO(MTYPE_I2, MTYPE_I8):
02411 case FROM_TO(MTYPE_I1, MTYPE_I8):
02412 case FROM_TO(MTYPE_B, MTYPE_I8):
02413 TCON_I8(r) = TCON_v0(c);
02414 break;
02415 case FROM_TO(MTYPE_U8, MTYPE_I8):
02416 TCON_I8(r) = TCON_U8(c);
02417 break;
02418 case FROM_TO(MTYPE_U4, MTYPE_I8):
02419 case FROM_TO(MTYPE_U2, MTYPE_I8):
02420 case FROM_TO(MTYPE_U1, MTYPE_I8):
02421 TCON_I8(r) = TCON_u0(c);
02422 break;
02423
02424 #ifdef TARG_NEEDS_QUAD_OPS
02425 case FROM_TO(MTYPE_CQ, MTYPE_I4):
02426 case FROM_TO(MTYPE_CQ, MTYPE_I2):
02427 case FROM_TO(MTYPE_CQ, MTYPE_I1):
02428 TCON_v0(r) = __c_ji_qint(R16_To_RQ(TCON_R16(c)), &err);
02429 break;
02430 #endif
02431 case FROM_TO(MTYPE_C8, MTYPE_I4):
02432 case FROM_TO(MTYPE_C8, MTYPE_I2):
02433 case FROM_TO(MTYPE_C8, MTYPE_I1):
02434 TCON_v0(r) = (INT32)TCON_R8(c);
02435 break;
02436 case FROM_TO(MTYPE_C4, MTYPE_I4):
02437 case FROM_TO(MTYPE_C4, MTYPE_I2):
02438 case FROM_TO(MTYPE_C4, MTYPE_I1):
02439 TCON_v0(r) = (INT32)TCON_R4(c);
02440 break;
02441 #ifdef TARG_NEEDS_QUAD_OPS
02442 case FROM_TO(MTYPE_FQ, MTYPE_I4):
02443 case FROM_TO(MTYPE_FQ, MTYPE_I2):
02444 case FROM_TO(MTYPE_FQ, MTYPE_I1):
02445 TCON_v0(r) = __c_ji_qint(R16_To_RQ(TCON_R16(c)), &err);
02446 break;
02447 #endif
02448 case FROM_TO(MTYPE_F8, MTYPE_I4):
02449 case FROM_TO(MTYPE_F8, MTYPE_I2):
02450 case FROM_TO(MTYPE_F8, MTYPE_I1):
02451 TCON_v0(r) = (INT32)TCON_R8(c);
02452 break;
02453 case FROM_TO(MTYPE_F4, MTYPE_I4):
02454 case FROM_TO(MTYPE_F4, MTYPE_I2):
02455 case FROM_TO(MTYPE_F4, MTYPE_I1):
02456 TCON_v0(r) = (INT32)TCON_R4(c);
02457 break;
02458 case FROM_TO(MTYPE_I8, MTYPE_I4):
02459 case FROM_TO(MTYPE_I8, MTYPE_I2):
02460 case FROM_TO(MTYPE_I8, MTYPE_I1):
02461 TCON_v0(r) = TCON_I8(c);
02462 break;
02463 case FROM_TO(MTYPE_I4, MTYPE_I2):
02464 case FROM_TO(MTYPE_I4, MTYPE_I1):
02465 case FROM_TO(MTYPE_I2, MTYPE_I4):
02466 case FROM_TO(MTYPE_I2, MTYPE_I1):
02467 case FROM_TO(MTYPE_I1, MTYPE_I4):
02468 case FROM_TO(MTYPE_I1, MTYPE_I2):
02469 case FROM_TO(MTYPE_B, MTYPE_I4):
02470 TCON_v0(r) = TCON_v0(c);
02471 break;
02472 case FROM_TO(MTYPE_U8, MTYPE_I4):
02473 case FROM_TO(MTYPE_U8, MTYPE_I2):
02474 case FROM_TO(MTYPE_U8, MTYPE_I1):
02475 TCON_v0(r) = TCON_U8(c);
02476 break;
02477 case FROM_TO(MTYPE_U4, MTYPE_I4):
02478 case FROM_TO(MTYPE_U4, MTYPE_I2):
02479 case FROM_TO(MTYPE_U4, MTYPE_I1):
02480 case FROM_TO(MTYPE_U2, MTYPE_I4):
02481 case FROM_TO(MTYPE_U2, MTYPE_I2):
02482 case FROM_TO(MTYPE_U2, MTYPE_I1):
02483 case FROM_TO(MTYPE_U1, MTYPE_I4):
02484 case FROM_TO(MTYPE_U1, MTYPE_I2):
02485 case FROM_TO(MTYPE_U1, MTYPE_I1):
02486 TCON_v0(r) = TCON_v0(c);
02487 break;
02488
02489 #ifdef TARG_NEEDS_QUAD_OPS
02490 case FROM_TO(MTYPE_CQ, MTYPE_U8):
02491 TCON_U8(r) = __c_ki_quint(R16_To_RQ(TCON_R16(c)), &err);
02492 break;
02493 #endif
02494 case FROM_TO(MTYPE_C8, MTYPE_U8):
02495 TCON_U8(r) = (UINT64)TCON_R8(c);
02496 break;
02497 case FROM_TO(MTYPE_C4, MTYPE_U8):
02498 TCON_U8(r) = (UINT64)TCON_R4(c);
02499 break;
02500 #ifdef TARG_NEEDS_QUAD_OPS
02501 case FROM_TO(MTYPE_FQ, MTYPE_U8):
02502 TCON_U8(r) = __c_ki_quint(R16_To_RQ(TCON_R16(c)), &err);
02503 break;
02504 #endif
02505 case FROM_TO(MTYPE_F8, MTYPE_U8):
02506 TCON_U8(r) = (UINT64)TCON_R8(c);
02507 break;
02508 case FROM_TO(MTYPE_F4, MTYPE_U8):
02509 TCON_U8(r) = (UINT64)TCON_R4(c);
02510 break;
02511 case FROM_TO(MTYPE_I8, MTYPE_U8):
02512 TCON_U8(r) = TCON_I8(c);
02513 break;
02514 case FROM_TO(MTYPE_I4, MTYPE_U8):
02515 case FROM_TO(MTYPE_I2, MTYPE_U8):
02516 case FROM_TO(MTYPE_I1, MTYPE_U8):
02517 case FROM_TO(MTYPE_B, MTYPE_U8):
02518 TCON_U8(r) = TCON_v0(c);
02519 break;
02520 case FROM_TO(MTYPE_U4, MTYPE_U8):
02521 case FROM_TO(MTYPE_U2, MTYPE_U8):
02522 case FROM_TO(MTYPE_U1, MTYPE_U8):
02523 TCON_U8(r) = TCON_u0(c);
02524 break;
02525
02526 #ifdef TARG_NEEDS_QUAD_OPS
02527 case FROM_TO(MTYPE_CQ, MTYPE_U4):
02528 case FROM_TO(MTYPE_CQ, MTYPE_U2):
02529 case FROM_TO(MTYPE_CQ, MTYPE_U1):
02530 TCON_u0(r) = __c_ji_quint(R16_To_RQ(TCON_R16(c)), &err);
02531 break;
02532 #endif
02533 case FROM_TO(MTYPE_C8, MTYPE_U4):
02534 case FROM_TO(MTYPE_C8, MTYPE_U2):
02535 case FROM_TO(MTYPE_C8, MTYPE_U1):
02536 TCON_u0(r) = (UINT32)TCON_R8(c);
02537 break;
02538 case FROM_TO(MTYPE_C4, MTYPE_U4):
02539 case FROM_TO(MTYPE_C4, MTYPE_U2):
02540 case FROM_TO(MTYPE_C4, MTYPE_U1):
02541 TCON_u0(r) = (UINT32)TCON_R4(c);
02542 break;
02543 #ifdef TARG_NEEDS_QUAD_OPS
02544 case FROM_TO(MTYPE_FQ, MTYPE_U4):
02545 case FROM_TO(MTYPE_FQ, MTYPE_U2):
02546 case FROM_TO(MTYPE_FQ, MTYPE_U1):
02547 TCON_u0(r) = __c_ji_quint(R16_To_RQ(TCON_R16(c)), &err);
02548 break;
02549 #endif
02550 case FROM_TO(MTYPE_F8, MTYPE_U4):
02551 case FROM_TO(MTYPE_F8, MTYPE_U2):
02552 case FROM_TO(MTYPE_F8, MTYPE_U1):
02553 TCON_u0(r) = (UINT32)TCON_R8(c);
02554 break;
02555 case FROM_TO(MTYPE_F4, MTYPE_U4):
02556 case FROM_TO(MTYPE_F4, MTYPE_U2):
02557 case FROM_TO(MTYPE_F4, MTYPE_U1):
02558 TCON_u0(r) = (UINT32)TCON_R4(c);
02559 break;
02560 case FROM_TO(MTYPE_I8, MTYPE_U4):
02561 case FROM_TO(MTYPE_I8, MTYPE_U2):
02562 case FROM_TO(MTYPE_I8, MTYPE_U1):
02563 case FROM_TO(MTYPE_I8, MTYPE_B):
02564 TCON_u0(r) = TCON_I8(c);
02565 break;
02566 case FROM_TO(MTYPE_I4, MTYPE_U4):
02567 case FROM_TO(MTYPE_I4, MTYPE_U2):
02568 case FROM_TO(MTYPE_I4, MTYPE_U1):
02569 case FROM_TO(MTYPE_I4, MTYPE_B):
02570 case FROM_TO(MTYPE_I2, MTYPE_U4):
02571 case FROM_TO(MTYPE_I2, MTYPE_U2):
02572 case FROM_TO(MTYPE_I2, MTYPE_U1):
02573 case FROM_TO(MTYPE_I2, MTYPE_B):
02574 case FROM_TO(MTYPE_I1, MTYPE_U4):
02575 case FROM_TO(MTYPE_I1, MTYPE_U2):
02576 case FROM_TO(MTYPE_I1, MTYPE_U1):
02577 case FROM_TO(MTYPE_I1, MTYPE_B):
02578 case FROM_TO(MTYPE_B, MTYPE_U4):
02579 TCON_v0(r) = TCON_v0(c);
02580 break;
02581 case FROM_TO(MTYPE_U8, MTYPE_U4):
02582 case FROM_TO(MTYPE_U8, MTYPE_U2):
02583 case FROM_TO(MTYPE_U8, MTYPE_U1):
02584 case FROM_TO(MTYPE_U8, MTYPE_B):
02585 TCON_u0(r) = TCON_U8(c);
02586 break;
02587 case FROM_TO(MTYPE_U4, MTYPE_U2):
02588 case FROM_TO(MTYPE_U4, MTYPE_U1):
02589 case FROM_TO(MTYPE_U4, MTYPE_B):
02590 case FROM_TO(MTYPE_U2, MTYPE_U4):
02591 case FROM_TO(MTYPE_U2, MTYPE_U1):
02592 case FROM_TO(MTYPE_U2, MTYPE_B):
02593 case FROM_TO(MTYPE_U1, MTYPE_U4):
02594 case FROM_TO(MTYPE_U1, MTYPE_U2):
02595 case FROM_TO(MTYPE_U1, MTYPE_B):
02596 TCON_v0(r) = TCON_v0(c);
02597 break;
02598
02599 default:
02600 Is_True ( FALSE, ( "Targ-Conv can not convert from %s to %s",
02601 Mtype_Name(ty_from), Mtype_Name(ty_to) ) );
02602 }
02603 TCON_ty(r) = ty_to;
02604 return r;
02605 }
02606
02607 #ifndef MONGOOSE_BE
02608
02609
02610
02611
02612
02613
02614
02615
02616
02617
02618
02619
02620
02621 static BOOL
02622 Targ_Atoll ( char *str, INT64 *i64, BOOL sgned )
02623 {
02624 UINT64 m, d;
02625 UINT64 mhi, mlo;
02626 INT16 digits;
02627 BOOL neg = FALSE;
02628 BOOL valid = TRUE;
02629
02630 if ( *str == '-' ) {
02631 neg = TRUE;
02632 str++;
02633 }
02634
02635 m = 0;
02636 digits = 0;
02637 while ( *str ) {
02638 d = *str - '0';
02639 if ( valid && ++digits >= 19 ) {
02640
02641 mhi = (UINT32) (m >> 32);
02642 mlo = (UINT32) m;
02643 mlo = 10 * mlo + d;
02644 mhi *= 10;
02645 if ( mlo > UINT32_MAX ) {
02646 mhi += mlo >> 32;
02647 }
02648 if ( ( sgned && mhi > INT32_MAX+(neg) ) ||
02649 ( ! sgned && mhi > UINT32_MAX ) )
02650 {
02651 valid = FALSE;
02652 }
02653 }
02654 m = 10 * m + d;
02655 str++;
02656 }
02657
02658 *i64 = neg ? -(INT64)m : (INT64)m;
02659 return valid;
02660 }
02661
02662
02663
02664
02665
02666
02667
02668
02669
02670
02671 TCON
02672 Targ_Atoc ( TYPE_ID ty, char *str )
02673 {
02674 static TCON c;
02675 INT64 m;
02676 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
02677 char *sstr;
02678 #endif
02679 INT err;
02680
02681 TCON_ty(c) = ty;
02682 TCON_v0(c) = 0;
02683 TCON_v1(c) = 0;
02684 TCON_v2(c) = 0;
02685 TCON_v3(c) = 0;
02686
02687 switch (ty) {
02688
02689 case MTYPE_I1:
02690 if ( ! Targ_Atoll ( str, &m, TRUE ) ||
02691 m > SCHAR_MAX ||
02692 m < SCHAR_MIN )
02693 {
02694 ErrMsg ( EC_Large_Const, str );
02695 }
02696 TCON_v0(c) = m;
02697 TCON_v1(c) = 0;
02698 break;
02699
02700 case MTYPE_I2:
02701 if ( ! Targ_Atoll ( str, &m, TRUE ) ||
02702 m > INT16_MAX ||
02703 m < INT16_MIN )
02704 {
02705 ErrMsg ( EC_Large_Const, str );
02706 }
02707 TCON_v0(c) = m;
02708 TCON_v1(c) = 0;
02709 break;
02710
02711 case MTYPE_I4:
02712 if ( ! Targ_Atoll ( str, &m, TRUE ) ||
02713 m > INT32_MAX ||
02714 m < INT32_MIN )
02715 {
02716 ErrMsg ( EC_Large_Const, str );
02717 }
02718 TCON_v0(c) = m;
02719 TCON_v1(c) = 0;
02720 break;
02721
02722 case MTYPE_I8:
02723 if ( ! Targ_Atoll ( str, &m, TRUE ) ) {
02724 ErrMsg ( EC_Large_Const, str );
02725 }
02726 TCON_I8(c) = m;
02727 break;
02728
02729 case MTYPE_U1:
02730 if ( ! Targ_Atoll ( str, &m, FALSE ) ||
02731 (UINT64) m > UCHAR_MAX )
02732 {
02733 ErrMsg ( EC_Large_Const, str );
02734 }
02735 TCON_u0(c) = (UINT8) m;
02736 TCON_u1(c) = 0;
02737 break;
02738
02739 case MTYPE_U2:
02740 if ( ! Targ_Atoll ( str, &m, FALSE ) ||
02741 (UINT64) m > UINT16_MAX )
02742 {
02743 ErrMsg ( EC_Large_Const, str );
02744 }
02745 TCON_u0(c) = (UINT16) m;
02746 TCON_u1(c) = 0;
02747 break;
02748
02749 case MTYPE_U4:
02750 if ( ! Targ_Atoll ( str, &m, FALSE ) ||
02751 (UINT64) m > UINT32_MAX )
02752 {
02753 ErrMsg ( EC_Large_Const, str );
02754 }
02755 TCON_u0(c) = (UINT32) m;
02756 TCON_u1(c) = 0;
02757 break;
02758
02759 case MTYPE_U8:
02760 if ( ! Targ_Atoll ( str, &m, FALSE ) ) {
02761 ErrMsg ( EC_Large_Const, str );
02762 }
02763 TCON_U8(c) = (UINT64) m;
02764 break;
02765
02766 case MTYPE_F4:
02767
02768
02769 TCON_R4(c) = atof(str);
02770 TCON_v0(c) = 0;
02771 break;
02772
02773 case MTYPE_F8:
02774 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
02775 for ( sstr = str; *sstr; sstr++ ) {
02776 if (*sstr == 'd' || *sstr == 'D') {
02777 *sstr='E';
02778 break;
02779 }
02780 }
02781 #endif
02782
02783 TCON_R8(c) = atof(str);
02784 break;
02785
02786 case MTYPE_FQ:
02787 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
02788 for ( sstr = str; *sstr; sstr++ ) {
02789 if (*sstr == 'q' || *sstr == 'Q') {
02790 *sstr='E';
02791 break;
02792 }
02793 }
02794 #endif
02795
02796 TCON_R16(c) = RQ_To_R16(__c_a_to_q(str, &err));
02797
02798 break;
02799
02800 default:
02801 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Targ_Atoc" );
02802 }
02803 return c;
02804 }
02805 #endif
02806
02807
02808
02809
02810
02811
02812
02813
02814
02815
02816
02817
02818
02819
02820 TCON
02821 Targ_Hexfptoc(const TYPE_ID ty, const char * const str)
02822 {
02823 static TCON c;
02824 char ac[9];
02825
02826 TCON_ty(c) = ty;
02827 TCON_u1(c) = 0;
02828 TCON_u0(c) = 0;
02829 TCON_u3(c) = 0;
02830 TCON_u2(c) = 0;
02831
02832
02833 ac[8] = '\0';
02834 switch (ty) {
02835 case MTYPE_FQ:
02836 strncpy(ac, str+24, 8);
02837 TCON_u2(c) = strtoul(ac, (char **)NULL, 16);
02838 strncpy(ac, str+16, 8);
02839 TCON_u3(c) = strtoul(ac, (char **)NULL, 16);
02840
02841 case MTYPE_F8:
02842 strncpy(ac, str+8, 8);
02843 TCON_u0(c) = strtoul(ac, (char **)NULL, 16);
02844
02845 case MTYPE_F4:
02846 strncpy(ac, str, 8);
02847 TCON_u1(c) = strtoul(ac, (char **)NULL, 16);
02848 break;
02849 default:
02850 ErrMsg(EC_Inv_Mtype, Mtype_Name(ty), "Targ_Hexfptoc");
02851 }
02852 return c;
02853 }
02854
02855
02856
02857
02858
02859
02860
02861
02862
02863
02864
02865
02866
02867
02868 char *
02869 Targ_Print (const char *fmt, TCON c )
02870 {
02871 INT slen,i;
02872 char *bytes;
02873 INT spos;
02874 BOOL string_as_bytes;
02875
02876 struct tpb {
02877 char buf[1024];
02878 };
02879 #define TPB_SIZE 8
02880 static struct tpb tpbuf[8];
02881 static INT tpidx = 0;
02882 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
02883 char *re;
02884 #endif
02885 char *r;
02886
02887 r = tpbuf[tpidx].buf;
02888 tpidx = (tpidx + 1) & 7;
02889 switch (TCON_ty(c)) {
02890 case MTYPE_STRING:
02891
02892
02893
02894 slen = TCON_len(c);
02895 bytes = Index_to_char_array (TCON_cp(c));
02896 string_as_bytes = FALSE;
02897 for (i = 0; i < slen-1; i++) {
02898 if (bytes[i] == '\0') {
02899 string_as_bytes = TRUE;
02900 break;
02901 }
02902 }
02903 if (string_as_bytes) {
02904 spos = 0;
02905 spos = sprintf(r,"(%d hex bytes) ",slen);
02906 for (i=0; i < slen && spos < 1000; i++) {
02907 if (i == slen-1) {
02908 spos += sprintf(r+spos,"%x",bytes[i]);
02909 } else {
02910 spos += sprintf(r+spos,"%x, ",bytes[i]);
02911 }
02912 }
02913 if (i < slen) {
02914 sprintf(r+spos,"...");
02915 }
02916 } else {
02917 sprintf(r, "(%d bytes) \"", slen);
02918 char *t = r + strlen (r);
02919 char *s = r + 1000;
02920 for (i = 0; i < slen && t < s; i++) {
02921 t = Targ_Append_To_Dbuf (t, bytes[i]);
02922 }
02923 if (i < slen) {
02924 sprintf(t,"...\"");
02925 } else {
02926 sprintf(t, "\"");
02927 }
02928 }
02929 break;
02930
02931 case MTYPE_B:
02932 case MTYPE_I1:
02933 case MTYPE_I2:
02934 case MTYPE_I4:
02935 case MTYPE_U1:
02936 case MTYPE_U2:
02937 case MTYPE_U4:
02938 if (fmt == NULL) fmt = "%1d";
02939 sprintf(r, fmt, TCON_v0(c));
02940 break;
02941
02942 case MTYPE_I8:
02943 case MTYPE_U8:
02944 if (fmt == NULL) fmt = "%1lld";
02945 sprintf(r, fmt, TCON_I8(c));
02946 break;
02947
02948 case MTYPE_F4:
02949 if (fmt == NULL) fmt = "%#12.7g";
02950 sprintf(r, fmt, TCON_R4(c));
02951 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
02952 if (re = strchr(r, 'e'))
02953 *re = 'd';
02954 #endif
02955 break;
02956
02957 case MTYPE_F8:
02958 if (fmt == NULL) fmt = "%#21.16g";
02959 sprintf(r, fmt, TCON_R8(c));
02960 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
02961 if (re = strchr(r, 'e'))
02962 *re = 'd';
02963 #endif
02964 break;
02965
02966 #ifdef TARG_NEEDS_QUAD_OPS
02967 case MTYPE_FQ:
02968 {
02969 INT dummy_err;
02970 QUAD q = R16_To_RQ(TCON_R16(c));
02971
02972
02973
02974
02975
02976 if ( q.hi == 0.0 && q.lo != 0.0)
02977 ErrMsg( EC_Ill_Quad_Const, TCON_u0(c), TCON_u1(c), TCON_u2(c), TCON_u3(c));
02978 __c_q_to_a(r, q, &dummy_err);
02979 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
02980 if (re = strchr(r, 'e'))
02981 *re = 'd';
02982 #endif
02983 }
02984 break;
02985 #endif
02986
02987 case MTYPE_C4:
02988 if (fmt == NULL) fmt = "%#12.7g, %#12.7g";
02989 sprintf(r, fmt, TCON_R4(c), TCON_IR4(c));
02990 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
02991 if (re = strchr(r, 'e'))
02992 *re = 'd';
02993 if (re = strrchr(r, 'e'))
02994 *re = 'd';
02995 #endif
02996 break;
02997
02998 case MTYPE_C8:
02999 if (fmt == NULL) fmt = "%#21.16g, %#21.16g";
03000 sprintf(r, fmt, TCON_R8(c), TCON_IR8(c));
03001 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
03002 if (re = strchr(r, 'e'))
03003 *re = 'd';
03004 if (re = strrchr(r, 'e'))
03005 *re = 'd';
03006 #endif
03007 break;
03008
03009 #ifdef TARG_NEEDS_QUAD_OPS
03010 case MTYPE_CQ:
03011 {
03012 INT dummy_err;
03013 INT l;
03014 QUAD q = R16_To_RQ(TCON_R16(c));
03015
03016
03017
03018
03019
03020 if ( q.hi == 0.0 && q.lo != 0.0)
03021 ErrMsg( EC_Ill_Quad_Const, TCON_u0(c), TCON_u1(c), TCON_u2(c), TCON_u3(c));
03022 __c_q_to_a(r, q, &dummy_err);
03023 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
03024 if (re = strchr(r, 'e'))
03025 *re = 'd';
03026 #endif
03027
03028 l = strlen(r);
03029 r [l++] = ',';
03030 r [l++] = ' ';
03031
03032 q = R16_To_RQ(TCON_IR16(c));
03033
03034
03035
03036
03037
03038 if ( q.hi == 0.0 && q.lo != 0.0)
03039 ErrMsg( EC_Ill_Quad_Const, TCON_u0(c), TCON_u1(c), TCON_u2(c), TCON_u3(c));
03040 __c_q_to_a(&r [l], q, &dummy_err);
03041 #if !(defined(FRONT_END_C) || defined(FRONT_END_CPLUSPLUS))
03042 if (re = strchr(r, 'e'))
03043 *re = 'd';
03044 #endif
03045 }
03046 break;
03047 #endif
03048
03049 default:
03050 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(c)), "Targ_Print" );
03051 }
03052 return r;
03053 }
03054
03055 INT64
03056 Targ_To_Host ( TCON c )
03057 {
03058 mINT32 i32;
03059
03060 switch (TCON_ty(c)) {
03061 case MTYPE_B:
03062 return (TCON_U4(c)&0x1);
03063 case MTYPE_I1:
03064 i32 = TCON_I4(c);
03065 return ((i32&0x80) ? 0xffffffffffffff00ll : 0ll) | (i32&0xff);
03066 case MTYPE_I2:
03067 i32 = TCON_I4(c);
03068 return ((i32&0x8000) ? 0xffffffffffff0000ll : 0ll) | (i32&0xffff);
03069 case MTYPE_U1:
03070 return (TCON_U4(c)&0xff);
03071 case MTYPE_U2:
03072 return (TCON_U4(c)&0xffff);
03073 case MTYPE_U4:
03074 return (TCON_U4(c)&0x00000000ffffffffll);
03075 case MTYPE_I4:
03076 return TCON_I4(c);
03077 case MTYPE_I8:
03078 return TCON_I8(c);
03079 case MTYPE_U8:
03080 return TCON_U8(c);
03081
03082 default:
03083 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(c)), "Targ_To_Host" );
03084 }
03085
03086 return 0;
03087 }
03088
03089 #ifndef MONGOOSE_BE
03090 INT64
03091 Targ_To_Signed_Host ( TCON c )
03092 {
03093 mINT32 i32;
03094
03095 switch (TCON_ty(c)) {
03096 case MTYPE_B:
03097 return (TCON_U4(c)&0x1);
03098 case MTYPE_I1:
03099 i32 = TCON_I4(c);
03100 return ((i32&0x80) ? 0xffffffffffffff00ll : 0ll) | (i32&0xff);
03101 case MTYPE_I2:
03102 i32 = TCON_I4(c);
03103 return ((i32&0x8000) ? 0xffffffffffff0000ll : 0ll) | (i32&0xffff);
03104 case MTYPE_U1:
03105 return (TCON_U4(c)&0xff);
03106 case MTYPE_U2:
03107 return (TCON_U4(c)&0xffff);
03108 case MTYPE_U4:
03109 return TCON_I4(c);
03110 case MTYPE_I4:
03111 return TCON_I4(c);
03112 case MTYPE_I8:
03113 return TCON_I8(c);
03114 case MTYPE_U8:
03115 return TCON_U8(c);
03116
03117 default:
03118 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(c)), "Targ_To_Signed_Host" );
03119 }
03120
03121 return 0;
03122 }
03123 #endif
03124
03125 TCON
03126 Host_To_Targ(TYPE_ID ty, INT64 v)
03127 {
03128 static TCON c;
03129
03130 TCON_clear(c);
03131
03132 switch (ty) {
03133 default:
03134 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Host_To_Targ" );
03135
03136 case MTYPE_B:
03137 case MTYPE_I1:
03138 case MTYPE_I2:
03139 case MTYPE_I4:
03140 case MTYPE_U1:
03141 case MTYPE_U2:
03142 case MTYPE_U4:
03143 TCON_ty(c) = ty;
03144 TCON_I8(c) = v;
03145 return c;
03146 case MTYPE_I8:
03147 case MTYPE_U8:
03148 TCON_ty(c) = ty;
03149 TCON_I8(c) = v;
03150 return c;
03151 }
03152 }
03153
03154
03155 TCON
03156 Host_To_Targ_Float ( TYPE_ID ty, double v )
03157 {
03158 TCON c;
03159
03160 switch (ty) {
03161 case MTYPE_C4:
03162 case MTYPE_F4:
03163 TCON_clear(c);
03164 TCON_ty(c) = ty;
03165 Set_TCON_R4(c,v);
03166 return c;
03167
03168 case MTYPE_C8:
03169 case MTYPE_F8:
03170 TCON_clear(c);
03171 TCON_ty(c) = ty;
03172 TCON_R8(c) = v;
03173 return c;
03174
03175 case MTYPE_CQ:
03176 case MTYPE_FQ:
03177 TCON_clear(c);
03178 c = Targ_Conv (MTYPE_FQ,
03179 Host_To_Targ_Float ( MTYPE_F8, v ) );
03180 TCON_ty(c) = ty;
03181 return c;
03182
03183 default:
03184 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Host_To_Targ_Float" );
03185 TCON_clear(c);
03186 TCON_ty(c) = MTYPE_F4;
03187 return c;
03188 }
03189 }
03190
03191
03192 TCON
03193 Host_To_Targ_Float_4 ( TYPE_ID ty, float v )
03194 {
03195 TCON c;
03196
03197 switch (ty) {
03198 case MTYPE_C4:
03199 case MTYPE_F4:
03200 TCON_clear(c);
03201 TCON_ty(c) = ty;
03202 Set_TCON_R4(c,v);
03203 return c;
03204
03205 case MTYPE_C8:
03206 case MTYPE_F8:
03207 TCON_clear(c);
03208 TCON_ty(c) = ty;
03209 TCON_R8(c) = v;
03210 return c;
03211
03212 case MTYPE_CQ:
03213 case MTYPE_FQ:
03214 TCON_clear(c);
03215 c = Targ_Conv (MTYPE_FQ,
03216 Host_To_Targ_Float ( MTYPE_F8, v ) );
03217 TCON_ty(c) = ty;
03218 return c;
03219
03220 default:
03221 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Host_To_Targ_Float" );
03222 TCON_clear(c);
03223 TCON_ty(c) = MTYPE_F4;
03224 return c;
03225 }
03226 }
03227
03228 TCON
03229 Host_To_Targ_UV( TYPE_ID ty)
03230 {
03231 TCON c;
03232
03233 TCON_clear(c);
03234 TCON_ty(c) = ty;
03235
03236 switch (ty) {
03237 case MTYPE_F4:
03238 TCON_v1(c)= 0xfffa5a5a;
03239 break;
03240 case MTYPE_F8:
03241 TCON_v0(c)= 0xfffa5a5a;
03242 TCON_v1(c)= 0xfffa5a5a;
03243 break;
03244 case MTYPE_FQ:
03245 TCON_v0(c)= 0xfffa5a5a;
03246 TCON_v1(c)= 0xfffa5a5a;
03247 TCON_v2(c)= 0xfffa5a5a;
03248 TCON_v3(c)= 0xfffa5a5a;
03249 break;
03250 case MTYPE_C4:
03251 TCON_v1(c)= 0xfffa5a5a;
03252 TCON_iv1(c)= 0xfffa5a5a;
03253 break;
03254 case MTYPE_C8:
03255 TCON_v0(c)= 0xfffa5a5a;
03256 TCON_v1(c)= 0xfffa5a5a;
03257 TCON_iv0(c)= 0xfffa5a5a;
03258 TCON_iv1(c)= 0xfffa5a5a;
03259 break;
03260 case MTYPE_CQ:
03261 TCON_v0(c)= 0xfffa5a5a;
03262 TCON_v1(c)= 0xfffa5a5a;
03263 TCON_v2(c)= 0xfffa5a5a;
03264 TCON_v3(c)= 0xfffa5a5a;
03265 TCON_iv0(c)= 0xfffa5a5a;
03266 TCON_iv1(c)= 0xfffa5a5a;
03267 TCON_iv2(c)= 0xfffa5a5a;
03268 TCON_iv3(c)= 0xfffa5a5a;
03269 break;
03270
03271 default:
03272 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Host_To_Targ_UV" );
03273 TCON_clear(c);
03274 TCON_ty(c) = MTYPE_F4;
03275 return c;
03276 }
03277 return c;
03278 }
03279
03280
03281 TCON
03282 Make_Complex ( TYPE_ID ctype, TCON real, TCON imag )
03283 {
03284 TCON c;
03285
03286 TCON_clear(c);
03287 TCON_ty(c) = ctype;
03288 switch (ctype) {
03289 case MTYPE_C4:
03290 Set_TCON_R4(c, TCON_R4(real));
03291 Set_TCON_IR4(c, TCON_R4(imag));
03292 break;
03293
03294 case MTYPE_C8:
03295 Set_TCON_R8(c, TCON_R8(real));
03296 Set_TCON_IR8(c, TCON_R8(imag));
03297 break;
03298
03299 case MTYPE_CQ:
03300 Set_TCON_R16(c, TCON_R16(real));
03301 Set_TCON_IR16(c, TCON_R16(imag));
03302 break;
03303
03304 default:
03305 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ctype), "Make_Complex" );
03306 break;
03307 }
03308 return c;
03309 }
03310
03311
03312 TCON
03313 Extract_Complex_Real(TCON complex)
03314 {
03315 TCON c;
03316 TCON_clear(c);
03317
03318 switch (TCON_ty(complex)) {
03319 case MTYPE_C4:
03320 TCON_ty(c) = MTYPE_F4;
03321 Set_TCON_R4(c, TCON_R4(complex));
03322 return c;
03323
03324 case MTYPE_C8:
03325 TCON_ty(c) = MTYPE_F8;
03326 Set_TCON_R8(c, TCON_R8(complex));
03327 return c;
03328
03329 case MTYPE_CQ:
03330 TCON_ty(c) = MTYPE_FQ;
03331 Set_TCON_R16(c, TCON_R16(complex));
03332 return c;
03333
03334 default:
03335 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(complex)), "Extract_Complex_Real" );
03336 TCON_ty(c) = MTYPE_F4;
03337 return c;
03338 }
03339 }
03340
03341 TCON
03342 Extract_Complex_Imag(TCON complex)
03343 {
03344 TCON c;
03345 TCON_clear(c);
03346
03347 switch (TCON_ty(complex)) {
03348 case MTYPE_C4:
03349 TCON_ty(c) = MTYPE_F4;
03350 Set_TCON_R4(c, TCON_IR4(complex));
03351 return c;
03352
03353 case MTYPE_C8:
03354 TCON_ty(c) = MTYPE_F8;
03355 Set_TCON_R8(c, TCON_IR8(complex));
03356 return c;
03357
03358 case MTYPE_CQ:
03359 TCON_ty(c) = MTYPE_FQ;
03360 Set_TCON_R16(c, TCON_IR16(complex));
03361 return c;
03362
03363 default:
03364 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(complex)), "Extract_Complex_Real" );
03365 TCON_ty(c) = MTYPE_F4;
03366 return c;
03367 }
03368 }
03369
03370 TCON
03371 Extract_Quad_Hi(TCON v)
03372 {
03373 TCON c;
03374 TCON_clear(c);
03375
03376 switch (TCON_ty(v)) {
03377 case MTYPE_FQ:
03378 {
03379 QUAD quadTemp = R16_To_RQ(TCON_R16(v));
03380
03381 TCON_ty(c) = MTYPE_F8;
03382 Set_TCON_R8(c, quadTemp.hi);
03383 return c;
03384 }
03385
03386
03387
03388
03389
03390
03391
03392
03393
03394
03395
03396 default:
03397 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(v)), "Extract_Quad_Hi" );
03398 TCON_ty(c) = MTYPE_F4;
03399 return c;
03400 }
03401 }
03402
03403 TCON
03404 Extract_Quad_Lo(TCON v)
03405 {
03406 TCON c;
03407 TCON_clear(c);
03408
03409 switch (TCON_ty(v)) {
03410 case MTYPE_FQ:
03411 {
03412 QUAD quadTemp = R16_To_RQ(TCON_R16(v));
03413
03414 TCON_ty(c) = MTYPE_F8;
03415 Set_TCON_R8(c, quadTemp.lo);
03416 return c;
03417 }
03418
03419
03420
03421
03422
03423
03424
03425
03426
03427
03428
03429 default:
03430 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(v)), "Extract_Quad_Lo" );
03431 TCON_ty(c) = MTYPE_F4;
03432 return c;
03433 }
03434 }
03435
03436 static TCON
03437 Extract_Paired_Hi(TCON v)
03438 {
03439 TCON c;
03440 TCON_clear(c);
03441
03442 switch (TCON_ty(v)) {
03443 case MTYPE_F8:
03444 case MTYPE_I8:
03445 case MTYPE_U8:
03446 {
03447
03448 TCON_ty(c) = MTYPE_I4;
03449 if (Target_Byte_Sex == LITTLE_ENDIAN)
03450 TCON_word0(c) = TCON_u1(v);
03451 else
03452 TCON_word0(c) = TCON_u0(v);
03453
03454 return c;
03455 }
03456 default:
03457 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(v)), "Extract_Paired_Hi" );
03458 TCON_ty(c) = MTYPE_F4;
03459 return c;
03460 }
03461 }
03462
03463 static TCON
03464 Extract_Paired_Lo(TCON v)
03465 {
03466 TCON c;
03467 TCON_clear(c);
03468
03469 switch (TCON_ty(v)) {
03470 case MTYPE_F8:
03471 case MTYPE_I8:
03472 case MTYPE_U8:
03473 {
03474
03475 TCON_ty(c) = MTYPE_I4;
03476 if (Target_Byte_Sex == LITTLE_ENDIAN)
03477 TCON_word0(c) = TCON_u0(v);
03478 else
03479 TCON_word0(c) = TCON_u1(v);
03480 return c;
03481 }
03482
03483
03484
03485
03486
03487
03488
03489
03490
03491
03492
03493 default:
03494 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(v)), "Extract_Paired_Lo" );
03495 TCON_ty(c) = MTYPE_F4;
03496 return c;
03497 }
03498 }
03499
03500 TCON
03501 Extract_Double_Hi(TCON v)
03502 {
03503 return Extract_Paired_Hi(v);
03504 }
03505
03506 TCON
03507 Extract_Double_Lo(TCON v)
03508 {
03509 return Extract_Paired_Lo(v);
03510 }
03511
03512 TCON
03513 Extract_LongLong_Hi(TCON v)
03514 {
03515 return Extract_Paired_Hi(v);
03516 }
03517
03518 TCON
03519 Extract_LongLong_Lo(TCON v)
03520 {
03521 return Extract_Paired_Lo(v);
03522 }
03523
03524 TCON
03525 Host_To_Targ_Quad(QUAD_TYPE v)
03526 {
03527 static TCON c;
03528
03529 TCON_ty(c) = MTYPE_FQ;
03530 TCON_R16(c) = v;
03531 return c;
03532 }
03533
03534 TCON
03535 Host_To_Targ_Complex_Quad(QUAD_TYPE real, QUAD_TYPE imag)
03536 {
03537 static TCON c;
03538
03539 TCON_ty(c) = MTYPE_CQ;
03540 TCON_R16(c) = real;
03541 TCON_IR16(c) = imag;
03542 return c;
03543 }
03544
03545
03546 double
03547 Targ_To_Host_Float(TCON fvalue)
03548 {
03549 INT16 ty = TCON_ty(fvalue);
03550
03551 switch (ty) {
03552 case MTYPE_F4:
03553 return (double)TCON_R4(fvalue);
03554
03555 case MTYPE_F8:
03556 return TCON_R8(fvalue);
03557
03558 case MTYPE_FQ:
03559 return Targ_To_Host_Float(Targ_Conv(MTYPE_F8, fvalue));
03560
03561 default:
03562 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Targ_To_Host_Float" );
03563 return Targ_To_Host_Float(Targ_Conv(MTYPE_F8, fvalue));
03564 }
03565 }
03566
03567 double
03568 Targ_To_Host_ComplexReal(TCON fvalue)
03569 {
03570 INT16 ty = TCON_ty(fvalue);
03571
03572 switch (ty) {
03573 case MTYPE_C4:
03574 return (double)TCON_R4(fvalue);
03575
03576 case MTYPE_C8:
03577 return TCON_R8(fvalue);
03578
03579 case MTYPE_CQ:
03580 return Targ_To_Host_Float(Targ_Conv(MTYPE_CQ, fvalue));
03581
03582 default:
03583 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Targ_To_Host_ComplexReal" );
03584 return Targ_To_Host_Float(Targ_Conv(MTYPE_C8, fvalue));
03585 }
03586 }
03587
03588 double
03589 Targ_To_Host_ComplexImag(TCON fvalue)
03590 {
03591 INT16 ty = TCON_ty(fvalue);
03592
03593 switch (ty) {
03594 case MTYPE_C4:
03595 return (double)TCON_IR4(fvalue);
03596
03597 case MTYPE_C8:
03598 return TCON_IR8(fvalue);
03599
03600 case MTYPE_CQ:
03601 return Targ_To_Host_Float(Targ_Conv(MTYPE_C8, fvalue));
03602
03603 default:
03604 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Targ_To_Host_ComplexImag" );
03605 return Targ_To_Host_Float(Targ_Conv(MTYPE_C8, fvalue));
03606 }
03607 }
03608
03609 QUAD_TYPE
03610 Targ_To_Host_Quad(TCON fvalue)
03611 {
03612 INT16 ty = TCON_ty(fvalue);
03613
03614 switch (ty) {
03615 case MTYPE_F4:
03616 return Targ_To_Host_Quad(Targ_Conv(MTYPE_FQ, fvalue));
03617
03618 case MTYPE_F8:
03619 return Targ_To_Host_Quad(Targ_Conv(MTYPE_FQ, fvalue));
03620
03621 case MTYPE_FQ:
03622 return TCON_R16(fvalue);
03623
03624 default:
03625 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Targ_To_Host_Quad" );
03626 return Targ_To_Host_Quad(Targ_Conv(MTYPE_FQ, fvalue));
03627 }
03628 }
03629
03630 INT
03631 fp_class_d( double x )
03632 {
03633 UINT64 ll, exp, mantissa;
03634 INT32 sign;
03635
03636 ll = *(UINT64*)&x;
03637 exp = (ll >> DMANTWIDTH);
03638 sign = (exp >> DEXPWIDTH);
03639 exp &= 0x7ff;
03640 mantissa = (ll & (DSIGNMASK & DEXPMASK));
03641 if ( exp == 0x7ff ) {
03642
03643 if ( mantissa == 0 )
03644 return ( (sign == 0) ? FP_POS_INF : FP_NEG_INF );
03645 else if ( mantissa & ~DQNANBITMASK )
03646 return ( FP_QNAN );
03647 else
03648 return ( FP_SNAN );
03649 }
03650
03651 if ( exp == 0 ) {
03652 if ( mantissa == 0 )
03653 return ( (sign == 0) ? FP_POS_ZERO : FP_NEG_ZERO );
03654 else
03655 return ( (sign == 0) ? FP_POS_DENORM : FP_NEG_DENORM );
03656 }
03657 else
03658 return ( (sign == 0) ? FP_POS_NORM : FP_NEG_NORM );
03659 }
03660
03661 INT
03662 fp_class_f( float x )
03663 {
03664 UINT32 n, exp, mantissa;
03665 INT32 sign;
03666
03667 n = *(UINT32 *)&x;
03668 exp = (n >> MANTWIDTH);
03669 sign = (exp >> EXPWIDTH);
03670 exp &= 0xff;
03671 mantissa = (n & (SIGNMASK & EXPMASK));
03672
03673 if ( exp == 0xff ) {
03674
03675 if ( mantissa == 0 )
03676 return ( (sign == 0) ? FP_POS_INF : FP_NEG_INF );
03677 else if ( mantissa & ~QNANBITMASK )
03678 return ( FP_QNAN );
03679 else
03680 return ( FP_SNAN );
03681 }
03682
03683 if ( exp == 0 ) {
03684 if ( mantissa == 0 )
03685 return ( (sign == 0) ? FP_POS_ZERO : FP_NEG_ZERO );
03686 else
03687 return ( (sign == 0) ? FP_POS_DENORM : FP_NEG_DENORM );
03688 }
03689 else
03690 return ( (sign == 0) ? FP_POS_NORM : FP_NEG_NORM );
03691 }
03692
03693 INT32
03694 Targ_fp_class(TCON fvalue)
03695 {
03696 INT16 ty = TCON_ty(fvalue);
03697
03698 switch (ty) {
03699 case MTYPE_F4:
03700 return fp_class_f(TCON_R4(fvalue));
03701
03702 case MTYPE_F8:
03703 return fp_class_d(TCON_R8(fvalue));
03704
03705 #ifdef TARG_NEEDS_QUAD_OPS
03706 case MTYPE_FQ:
03707 return __c_fp_class_q(R16_To_RQ(TCON_R16(fvalue)));
03708 #endif
03709
03710 default:
03711 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Targ_fp_class" );
03712 return FP_QNAN;
03713 }
03714 }
03715
03716 TCON
03717 Host_To_Targ_Complex ( TYPE_ID ty, double real, double imag )
03718 {
03719 TCON c;
03720
03721 switch (ty) {
03722
03723 case MTYPE_C4:
03724
03725 TCON_clear(c);
03726 TCON_ty(c) = ty;
03727 TCON_R4(c) = real;
03728 TCON_IR4(c) = imag;
03729 return c;
03730
03731 case MTYPE_C8:
03732
03733 TCON_clear(c);
03734 TCON_ty(c) = ty;
03735 TCON_R8(c) = real;
03736 TCON_IR8(c) = imag;
03737 return c;
03738
03739 default:
03740
03741 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Host_To_Targ_Complex" );
03742 TCON_clear(c);
03743 TCON_ty(c) = MTYPE_C4;
03744 return c;
03745 }
03746 }
03747
03748 TCON
03749 Host_To_Targ_Complex_4 ( TYPE_ID ty, float real, float imag )
03750 {
03751 TCON c;
03752
03753 switch (ty) {
03754
03755 case MTYPE_C4:
03756
03757 TCON_clear(c);
03758 TCON_ty(c) = ty;
03759 TCON_R4(c) = real;
03760 TCON_IR4(c) = imag;
03761 return c;
03762
03763 case MTYPE_C8:
03764
03765 TCON_clear(c);
03766 TCON_ty(c) = ty;
03767 TCON_R8(c) = real;
03768 TCON_IR8(c) = imag;
03769 return c;
03770
03771 default:
03772
03773 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Host_To_Targ_Complex_4" );
03774 TCON_clear(c);
03775 TCON_ty(c) = MTYPE_C4;
03776 return c;
03777 }
03778 }
03779
03780
03781
03782 TCON
03783 Host_To_Targ_String ( TYPE_ID ty, const char *v, UINT32 l )
03784 {
03785 static TCON c;
03786 BOOL add_null = FALSE;
03787 Is_True(ty==MTYPE_STRING,
03788 ("Bad type of const to Host_To_Targ_String: %s", Mtype_Name(ty)));
03789 TCON_clear(c);
03790 TCON_ty(c) = ty;
03791
03792
03793 if (l == 0 || v[l-1] != '\0')
03794 add_null = TRUE;
03795
03796 TCON_cp(c) = Save_StrN(v, (add_null ? l+1 : l));
03797 if (add_null)
03798 Index_to_char_array (TCON_cp(c))[l] = '\0';
03799 TCON_len(c) = l;
03800 return (c);
03801 }
03802
03803 char *
03804 Targ_String_Address ( TCON c )
03805 {
03806 Is_True(TCON_ty(c)==MTYPE_STRING,
03807 ("Bad type of const to Host_To_Targ_String: %s",
03808 Mtype_Name(TCON_ty(c))));
03809 return Index_to_char_array (TCON_cp(c));
03810 }
03811
03812 mUINT32
03813 Targ_String_Length ( TCON c )
03814 {
03815 Is_True(TCON_ty(c)==MTYPE_STRING,
03816 ("Bad type of const to Host_To_Targ_String: %s",
03817 Mtype_Name(TCON_ty(c))));
03818 return ( TCON_len(c) );
03819 }
03820
03821
03822 static TCON Targ_Ipower(TCON base, UINT64 exp, BOOL neg_exp, BOOL *folded, TYPE_ID btype)
03823 {
03824 OPCODE mpy_op,div_op;
03825 TCON r;
03826 #ifdef TARG_NEEDS_QUAD_OPS
03827 INT err;
03828 #endif
03829
03830 *folded = TRUE;
03831 TCON_clear(r);
03832 TCON_ty(r) = btype;
03833
03834 switch (btype) {
03835 case MTYPE_I4:
03836 mpy_op = OPC_I4MPY;
03837 div_op = OPCODE_UNKNOWN;
03838 TCON_I4(r) = 1;
03839 break;
03840 case MTYPE_U4:
03841 mpy_op = OPC_U4MPY;
03842 div_op = OPCODE_UNKNOWN;
03843 TCON_U4(r) = 1;
03844 break;
03845 case MTYPE_I8:
03846 mpy_op = OPC_I8MPY;
03847 div_op = OPCODE_UNKNOWN;
03848 TCON_I8(r) = 1;
03849 break;
03850 case MTYPE_U8:
03851 mpy_op = OPC_U8MPY;
03852 div_op = OPCODE_UNKNOWN;
03853 TCON_U8(r) = 1;
03854 break;
03855 case MTYPE_F4:
03856 mpy_op = OPC_F4MPY;
03857 div_op = OPC_F4RECIP;
03858 TCON_R4(r) = 1.0;
03859 break;
03860 case MTYPE_F8:
03861 mpy_op = OPC_F8MPY;
03862 div_op = OPC_F8RECIP;
03863 TCON_R8(r) = 1.0;
03864 break;
03865 #ifdef TARG_NEEDS_QUAD_OPS
03866 case MTYPE_FQ:
03867 mpy_op = OPC_FQMPY;
03868 div_op = OPC_FQRECIP;
03869 TCON_R16(r) = RQ_To_R16(__c_q_ext(1.0,&err));
03870 break;
03871 #endif
03872 case MTYPE_C4:
03873 mpy_op = OPC_C4MPY;
03874 div_op = OPC_C4RECIP;
03875 TCON_R4(r) = 1.0;
03876 break;
03877 case MTYPE_C8:
03878 mpy_op = OPC_C8MPY;
03879 div_op = OPC_C8RECIP;
03880 TCON_R8(r) = 1.0;
03881 break;
03882 #ifdef TARG_NEEDS_QUAD_OPS
03883 case MTYPE_CQ:
03884 mpy_op = OPC_CQMPY;
03885 div_op = OPC_CQRECIP;
03886 TCON_R16(r) = RQ_To_R16(__c_q_ext(1.0,&err));
03887 break;
03888 #endif
03889 }
03890
03891
03892 while (exp != 0) {
03893 if (exp & 1) {
03894 r = Targ_WhirlOp(mpy_op,r,base,NULL);
03895 }
03896 base = Targ_WhirlOp(mpy_op,base,base,NULL);
03897 exp >>= 1;
03898 }
03899
03900
03901 if (neg_exp) {
03902 if (div_op) {
03903 r = Targ_WhirlOp(div_op,r,r,folded);
03904 } else {
03905
03906
03907 switch (TCON_ty(base)) {
03908 case MTYPE_I4:
03909 if (TCON_I4(r) == 0) {
03910 *folded = FALSE;
03911 } else if (TCON_I4(r) != 1 && TCON_I4(r) != -1) {
03912 TCON_I4(r) = 0;
03913 }
03914 break;
03915 case MTYPE_U4:
03916 if (TCON_U4(r) == 0) {
03917 *folded = FALSE;
03918 } else if (TCON_U4(r) != 1) {
03919 TCON_U4(r) = 0;
03920 }
03921 break;
03922 case MTYPE_I8:
03923 if (TCON_I8(r) == 0) {
03924 *folded = FALSE;
03925 } else if (TCON_I8(r) != 1 && TCON_I8(r) != -1) {
03926 TCON_I8(r) = 0;
03927 }
03928 break;
03929 case MTYPE_U8:
03930 if (TCON_U8(r) == 0) {
03931 *folded = FALSE;
03932 } else if (TCON_U8(r) != 1) {
03933 TCON_U8(r) = 0;
03934 }
03935 break;
03936 }
03937 }
03938 }
03939 return (r);
03940 }
03941
03942
03943
03944
03945
03946
03947 static TCON Targ_Power(TCON base, TCON exp, BOOL *folded, TYPE_ID btype)
03948 {
03949 UINT64 int_exp;
03950 BOOL neg_exp;
03951 TCON r;
03952
03953
03954 TCON_clear (r);
03955
03956
03957 if (TCON_ty(exp) == MTYPE_U8) {
03958 return (Targ_Ipower(base, TCON_U8(exp), FALSE, folded, btype));
03959 } else if (TCON_ty(exp) == MTYPE_U4) {
03960 return (Targ_Ipower(base, (UINT64) TCON_U4(exp), FALSE, folded, btype));
03961 } else if (TCON_ty(exp) == MTYPE_I4) {
03962 int_exp = TCON_I4(exp);
03963 neg_exp = FALSE;
03964 if ((INT64) int_exp < 0) {
03965 neg_exp = TRUE;
03966 int_exp = -((INT64) int_exp);
03967 }
03968 return (Targ_Ipower(base,int_exp,neg_exp,folded,btype));
03969
03970 } else if (TCON_ty(exp) == MTYPE_I8) {
03971 int_exp = TCON_I8(exp);
03972 neg_exp = FALSE;
03973
03974 if (int_exp == 0x8000000000000000LL) {
03975 neg_exp = TRUE;
03976 } else if ((INT64) int_exp < 0) {
03977 int_exp = -((INT64)int_exp);
03978 neg_exp = TRUE;
03979 }
03980 return (Targ_Ipower(base,int_exp,neg_exp,folded,btype));
03981 }
03982
03983
03984 if (TCON_ty(base) != TCON_ty(exp)) {
03985 if (folded) *folded = FALSE;
03986 return (r);
03987 }
03988
03989
03990
03991 switch (TCON_ty(base)) {
03992 case MTYPE_F4:
03993 TCON_ty(r) = MTYPE_F4;
03994 TCON_R4(r) = pow ((double) TCON_R4(base), (double) TCON_R4(exp));
03995 break;
03996
03997 case MTYPE_F8:
03998 TCON_ty(r) = MTYPE_F8;
03999 TCON_R8(r) = pow (TCON_R8(base),TCON_R8(exp));
04000 break;
04001
04002 default:
04003
04004 if (folded) *folded = FALSE;
04005 break;
04006 }
04007
04008 return (r);
04009 }
04010
04011 #ifndef MONGOOSE_BE
04012 TCON
04013 Targ_Pow ( TCON a, TCON b )
04014
04015
04016 {
04017 INT32 va, vb, r;
04018
04019 va = TCON_v0(a);
04020 vb = TCON_v0(b);
04021 if (va == 0)
04022 r = 0;
04023 else if (va == 1)
04024 r = 1;
04025 else if (va == -1) {
04026 if (vb < 0) vb = -vb;
04027 r = (vb % 2) ? -1 : 1;
04028 } else if (vb == 0)
04029 r = 1;
04030 else if (vb < 0)
04031 r = 0;
04032 else {
04033 if (vb >= 63) {
04034
04035 r = 0;
04036 } else {
04037 r = 1;
04038 while (vb--) r *= va;
04039 }
04040 }
04041 TCON_v0(a) = r;
04042 return a;
04043 }
04044 #endif
04045
04046
04047
04048
04049
04050
04051
04052
04053
04054
04055
04056
04057 char *
04058 Targ_Append_To_Dbuf (char *str, char ch)
04059 {
04060 char ch1;
04061 if ( ch >= ' ' && ch <= '~' && ch != '\\' ) {
04062 *str++ = ch;
04063 } else {
04064 ch1 = 0;
04065 switch ( ch ) {
04066 case '\n': ch1 = 'n'; break;
04067 case '\t': ch1 = 't'; break;
04068 case '\b': ch1 = 'b'; break;
04069 case '\r': ch1 = 'r'; break;
04070 case '\f': ch1 = 'f'; break;
04071 case '\v': ch1 = 'v'; break;
04072 case '\?': ch1 = '?'; break;
04073 case '\\': ch1 = '\\'; break;
04074 }
04075 *str++ = '\\';
04076 if (ch1)
04077 *str++ = ch1;
04078 else {
04079 sprintf(str, "%03o", ch & 0xff);
04080 str += 3;
04081 }
04082 }
04083 return str;
04084 }
04085
04086 #define DUMP_STR 1
04087 #ifdef DUMP_STR
04088 #define APPEND_TO_DBUF(a,b) a = Targ_Append_To_Dbuf(a,b)
04089 #else
04090 #define APPEND_TO_DBUF(a,b)
04091 #endif
04092
04093 #ifndef MONGOOSE_BE
04094
04095
04096
04097
04098
04099
04100
04101
04102
04103
04104
04105
04106
04107
04108
04109
04110
04111
04112
04113
04114
04115
04116
04117
04118
04119
04120
04121
04122
04123
04124 BOOL
04125 Targ_Format_String (
04126 char *s,
04127 INT32 slen,
04128 char *buf,
04129 INT32 blen,
04130 INT32 line,
04131 char *divider )
04132 {
04133 INT32 len=0;
04134 INT32 llen=0;
04135 INT32 dlen = divider ? strlen(divider) : 0;
04136 char cbuf[5];
04137 INT16 clen;
04138 INT32 i;
04139
04140
04141 if ( slen == 0 ) slen = strlen(s);
04142 if ( line == 0 || divider == NULL ) line = blen;
04143
04144 for ( i=0; i<slen; i++ ) {
04145
04146
04147
04148
04149 clen = Targ_Append_To_Dbuf ( cbuf, s[i] ) - cbuf;
04150 cbuf[clen] = 0;
04151
04152
04153
04154
04155 if ( llen > line-clen ) {
04156
04157 if ( len < blen-dlen-clen-1 ) {
04158 (void) strcpy ( buf, divider );
04159 buf += dlen;
04160 len += dlen;
04161 llen = 0;
04162 }
04163 }
04164
04165
04166 if ( len+clen < blen ) {
04167
04168 (void) strcpy ( buf, cbuf );
04169 buf += clen;
04170 len += clen;
04171 llen += clen;
04172 } else {
04173
04174 if ( blen - len < 4 ) buf -= (len+4)-blen;
04175 (void) strcpy ( buf, "..." );
04176 return FALSE;
04177 }
04178 }
04179
04180
04181
04182
04183 return TRUE;
04184 }
04185
04186
04187
04188 #ifdef HAS_TCON_TO_STR
04189
04190
04191
04192
04193
04194
04195
04196
04197 char *
04198 Tcon_To_Str(buf, v)
04199 TCON v;
04200 char *buf;
04201 {
04202 INT *ip = (INT *) buf;
04203 float *fp = (float *) buf;
04204 double *dp = (double *) buf;
04205 switch (TCON_ty(v)) {
04206 case MTYPE_B:
04207 case MTYPE_I1:
04208 case MTYPE_I2:
04209 case MTYPE_I4:
04210 case MTYPE_U1:
04211 case MTYPE_U2:
04212 case MTYPE_U4:
04213
04214
04215 *ip = TCON_v0(v);
04216 break;
04217 case MTYPE_I8:
04218 case MTYPE_U8:
04219
04220
04221 *ip = TCON_I8(v);
04222 break;
04223 case MTYPE_F4:
04224
04225
04226
04227
04228
04229 *fp = TCON_R4(v);
04230 break;
04231 case MTYPE_F8:
04232 *dp = TCON_R8(v);
04233 break;
04234 default:
04235 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(v)), "Tcon_To_Str" );
04236 }
04237 return buf;
04238 }
04239
04240
04241
04242
04243
04244
04245
04246
04247
04248
04249
04250
04251
04252 TCON
04253 Str_To_Tcon(TYPE_ID ty, char *buf)
04254 {
04255 union {
04256 double d_align;
04257 char buf[2*sizeof(double)];
04258 } local_buf;
04259 char *tbuf = (char *)&local_buf;
04260 TCON c;
04261
04262 TCON_ty(c) = ty;
04263
04264 switch (ty) {
04265 case MTYPE_I1:
04266 case MTYPE_U1:
04267 TCON_v0(c) = *buf;
04268 TCON_v1(c) = 0;
04269 break;
04270 case MTYPE_I2:
04271 case MTYPE_U2:
04272 if (Same_Byte_Sex) {
04273 tbuf[0] = buf[0];
04274 tbuf[1] = buf[1];
04275 } else {
04276 tbuf[0] = buf[1];
04277 tbuf[1] = buf[0];
04278 }
04279 TCON_v0(c) = *((mINT16 *)tbuf);
04280 TCON_v1(c) = 0;
04281 break;
04282 case MTYPE_I4:
04283 case MTYPE_U4:
04284
04285
04286 if (Same_Byte_Sex) {
04287 tbuf[0] = buf[0];
04288 tbuf[1] = buf[1];
04289 tbuf[2] = buf[2];
04290 tbuf[3] = buf[3];
04291 } else {
04292 tbuf[0] = buf[3];
04293 tbuf[1] = buf[2];
04294 tbuf[2] = buf[1];
04295 tbuf[3] = buf[0];
04296 }
04297 TCON_v0(c) = *((INT32 *)tbuf);
04298 TCON_v1(c) = 0;
04299 break;
04300 case MTYPE_I8:
04301 case MTYPE_U8:
04302
04303
04304 if (Same_Byte_Sex) {
04305 tbuf[0] = buf[0];
04306 tbuf[1] = buf[1];
04307 tbuf[2] = buf[2];
04308 tbuf[3] = buf[3];
04309 tbuf[4] = buf[4];
04310 tbuf[5] = buf[5];
04311 tbuf[6] = buf[6];
04312 tbuf[7] = buf[7];
04313 TCON_I8(c) = *((INT64 *)tbuf);
04314 } else {
04315
04316
04317
04318
04319
04320
04321
04322
04323
04324
04325
04326 tbuf[0] = buf[7];
04327 tbuf[1] = buf[6];
04328 tbuf[2] = buf[5];
04329 tbuf[3] = buf[4];
04330 TCON_v0(c) = *((INT *)tbuf);
04331 tbuf[0] = buf[3];
04332 tbuf[1] = buf[2];
04333 tbuf[2] = buf[1];
04334 tbuf[3] = buf[0];
04335 TCON_v1(c) = *((INT *)tbuf);
04336 }
04337 break;
04338 case MTYPE_F4:
04339
04340
04341
04342
04343
04344
04345
04346
04347
04348 if (Same_Byte_Sex) {
04349 tbuf[0] = buf[0];
04350 tbuf[1] = buf[1];
04351 tbuf[2] = buf[2];
04352 tbuf[3] = buf[3];
04353 } else {
04354 tbuf[0] = buf[3];
04355 tbuf[1] = buf[2];
04356 tbuf[2] = buf[1];
04357 tbuf[3] = buf[0];
04358 }
04359 Set_TCON_R4 ( c, *((float *)tbuf) );
04360 TCON_v1(c) = 0;
04361 break;
04362
04363 case MTYPE_F8:
04364 if (Same_Byte_Sex) {
04365 tbuf[0] = buf[0];
04366 tbuf[1] = buf[1];
04367 tbuf[2] = buf[2];
04368 tbuf[3] = buf[3];
04369 tbuf[4] = buf[4];
04370 tbuf[5] = buf[5];
04371 tbuf[6] = buf[6];
04372 tbuf[7] = buf[7];
04373 TCON_R8(c) = *((double *)tbuf);
04374 } else {
04375
04376
04377
04378
04379
04380
04381
04382
04383
04384
04385
04386 tbuf[0] = buf[7];
04387 tbuf[1] = buf[6];
04388 tbuf[2] = buf[5];
04389 tbuf[3] = buf[4];
04390 TCON_v0(c) = *((INT *)tbuf);
04391 tbuf[0] = buf[3];
04392 tbuf[1] = buf[2];
04393 tbuf[2] = buf[1];
04394 tbuf[3] = buf[0];
04395 TCON_v1(c) = *((INT *)tbuf);
04396 }
04397 break;
04398
04399 default:
04400 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Str_To_Tcon" );
04401 }
04402 return c;
04403 }
04404
04405 #if 0
04406
04407
04408
04409
04410
04411
04412
04413
04414
04415
04416
04417
04418
04419
04420
04421
04422
04423
04424
04425
04426
04427 TCON
04428 Bit_Str_To_Tcon ( TYPE_ID ty, char *arg_buf )
04429 {
04430 static TCON c;
04431 unsigned char *buf;
04432 UINT temp;
04433
04434 buf = (unsigned char *)arg_buf;
04435 TCON_ty(c) = ty;
04436
04437 switch (ty) {
04438 case MTYPE_I1:
04439 case MTYPE_U1:
04440 TCON_v0(c) = buf[0];
04441 TCON_v1(c) = 0;
04442 break;
04443
04444 case MTYPE_I2:
04445 case MTYPE_U2:
04446 TCON_v0(c) = (buf[1] << 8) | buf[0];
04447 TCON_v1(c) = 0;
04448 break;
04449
04450 case MTYPE_I4:
04451 case MTYPE_U4:
04452 TCON_v0(c) = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
04453 TCON_v1(c) = 0;
04454 break;
04455
04456 case MTYPE_F4:
04457
04458
04459
04460 temp = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
04461 Set_TCON_R4(c, *((float *)&temp));
04462 TCON_v1(c) = 0;
04463 break;
04464
04465 case MTYPE_F8:
04466
04467
04468
04469
04470
04471
04472
04473 #if HOST_IS_BIG_ENDIAN
04474 TCON_v1(c) = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
04475 TCON_v0(c) = (buf[7] << 24) | (buf[6] << 16) | (buf[5] << 8) | buf[4];
04476 #else
04477 TCON_v0(c) = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
04478 TCON_v1(c) = (buf[7] << 24) | (buf[6] << 16) | (buf[5] << 8) | buf[4];
04479 #endif
04480 break;
04481
04482 case MTYPE_FQ:
04483
04484
04485
04486
04487
04488
04489
04490 #if HOST_IS_BIG_ENDIAN
04491 TCON_v3(c) = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
04492 TCON_v2(c) = (buf[7] << 24) | (buf[6] << 16) | (buf[5] << 8) | buf[4];
04493 TCON_v1(c) = (buf[11] << 24) | (buf[10] << 16) | (buf[9] << 8) | buf[8];
04494 TCON_v0(c) = (buf[15] << 24) | (buf[14] << 16) | (buf[13] << 8) | buf[12];
04495 #else
04496 TCON_v0(c) = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
04497 TCON_v1(c) = (buf[7] << 24) | (buf[6] << 16) | (buf[5] << 8) | buf[4];
04498 TCON_v2(c) = (buf[11] << 24) | (buf[10] << 16) | (buf[9] << 8) | buf[8];
04499 TCON_v3(c) = (buf[15] << 24) | (buf[14] << 16) | (buf[13] << 8) | buf[12];
04500 #endif
04501 break;
04502
04503 default:
04504 ErrMsg ( EC_Inv_Mtype, Mtype_Name(ty), "Bit_Str_To_Tcon" );
04505 }
04506 return c;
04507 }
04508 #endif
04509
04510 #endif
04511
04512 #endif
04513
04514
04515
04516
04517
04518
04519
04520
04521
04522
04523
04524 BOOL
04525 Targ_Is_Integral ( TCON tc, INT64 *iv )
04526 {
04527 switch (TCON_ty(tc)) {
04528 case MTYPE_B:
04529 case MTYPE_I1:
04530 case MTYPE_I2:
04531 case MTYPE_I4:
04532 *iv = TCON_v0(tc);
04533 return TRUE;
04534
04535 case MTYPE_U1:
04536 case MTYPE_U2:
04537 case MTYPE_U4:
04538 *iv = TCON_u0(tc);
04539 return TRUE;
04540
04541 case MTYPE_I8:
04542 case MTYPE_U8:
04543 *iv = TCON_I8(tc);
04544 return TRUE;
04545
04546 case MTYPE_F4:
04547 {
04548 INT32 k = (INT32)TCON_R4(tc);
04549 float s = k;
04550 if (s == TCON_R4(tc)) {
04551 *iv = k;
04552 return TRUE;
04553 }
04554 }
04555 return FALSE;
04556
04557 case MTYPE_F8:
04558 {
04559 INT64 k = (INT64)TCON_R8(tc);
04560 double d = k;
04561 if (d == TCON_R8(tc)) {
04562 *iv = k;
04563 return TRUE;
04564 }
04565 }
04566 return FALSE;
04567
04568 #ifdef TARG_NEEDS_QUAD_OPS
04569 case MTYPE_FQ:
04570 {
04571 QUAD q;
04572 INT32 err;
04573 INT32 k = __c_ji_qint(R16_To_RQ(TCON_R16(tc)), &err);
04574 if (err) return FALSE;
04575 q = __c_q_flotj(k, &err);
04576 if (err) return FALSE;
04577 if (__c_q_eq(q, R16_To_RQ(TCON_R16(tc)), &err)) {
04578 if (err) return FALSE;
04579 *iv = k;
04580 return TRUE;
04581 }
04582 }
04583 return FALSE;
04584 #endif
04585
04586
04587 case MTYPE_C4:
04588 case MTYPE_C8:
04589 case MTYPE_CQ:
04590 return FALSE;
04591
04592 case MTYPE_STR:
04593 return FALSE;
04594
04595 default:
04596 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(tc)),
04597 "Targ_Is_Integral" );
04598 }
04599 return FALSE;
04600 }
04601 #ifdef OLDCODE
04602 #ifdef FRONT_END
04603
04604
04605
04606
04607
04608 WN *
04609 Coerce_To_Integer(subtree)
04610 WN *subtree;
04611 {
04612 TCON operand, truncated, converted;
04613 WN *coerced_subtree;
04614 INT32 err;
04615
04616 coerced_subtree = subtree;
04617 truncated = MTYPE_size_min(TY_btype(The_Tree_Type(subtree))) <= 32 ?
04618 Zero_I4_Tcon : Zero_I8_Tcon;
04619
04620 if (Is_Const(subtree, &operand)) {
04621 switch (TCON_ty(operand)) {
04622 case MTYPE_B:
04623 case MTYPE_I1:
04624 case MTYPE_I2:
04625 case MTYPE_I4:
04626 case MTYPE_I8:
04627 case MTYPE_U1:
04628 case MTYPE_U2:
04629 case MTYPE_U4:
04630 case MTYPE_U8:
04631 break;
04632
04633 case MTYPE_F4:
04634 TCON_v0(truncated) = TCON_R4(operand);
04635 Set_TCON_R4 ( converted, TCON_v0(truncated) );
04636 if (TCON_R4(converted) == TCON_R4(operand)) {
04637 TCON_ty(truncated) = MTYPE_I4;
04638 coerced_subtree = Make_Const(truncated);
04639 }
04640 break;
04641
04642 case MTYPE_F8:
04643 TCON_v0(truncated) = TCON_R8(operand);
04644 TCON_R8(converted) = TCON_v0(truncated);
04645 if (TCON_R8(converted) == TCON_R8(operand)) {
04646 TCON_ty(truncated) = MTYPE_I4;
04647 coerced_subtree = Make_Const(truncated);
04648 }
04649 break;
04650
04651 #ifdef TARG_NEEDS_QUAD_OPS
04652 case MTYPE_FQ:
04653 TCON_v0(truncated) = __c_ji_qint(R16_To_RQ(TCON_R16(operand)), &err);
04654 TCON_R16(converted) = RQ_To_R16(__c_q_flotj(TCON_v0(truncated), &err));
04655 if (__c_q_eq(R16_To_RQ(TCON_R16(converted)),
04656 R16_To_RQ(TCON_R16(operand)),
04657 &err)) {
04658 TCON_ty(truncated) = MTYPE_I4;
04659 coerced_subtree = Make_Const(truncated);
04660 }
04661 break;
04662 #endif
04663
04664 default:
04665 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(operand)),
04666 "Coerce_To_Integer" );
04667 break;
04668 }
04669 }
04670 return coerced_subtree;
04671 }
04672 #endif
04673 #endif
04674
04675
04676
04677
04678
04679 BOOL Targ_Is_Zero ( TCON t )
04680 {
04681 switch (TCON_ty(t)) {
04682 case MTYPE_B:
04683 case MTYPE_I1:
04684 case MTYPE_I2:
04685 case MTYPE_I4:
04686 case MTYPE_U1:
04687 case MTYPE_U2:
04688 case MTYPE_U4:
04689 return TCON_v0(t) == 0;
04690 case MTYPE_F4:
04691
04692
04693 return (TCON_R4(t) == 0.0 && TCON_v0(t) == 0);
04694
04695 case MTYPE_I8:
04696 case MTYPE_U8:
04697 return (TCON_v0(t)|TCON_v1(t)) == 0;
04698 case MTYPE_F8:
04699
04700
04701 return (TCON_R8(t) == 0.0
04702 && (TCON_v0(t)|TCON_v1(t)) == 0);
04703
04704 #ifdef TARG_NEEDS_QUAD_OPS
04705 case MTYPE_FQ:
04706 {
04707 INT32 dummy_err;
04708
04709 return (__c_q_eq(R16_To_RQ(TCON_R16(t)),
04710 __c_q_extd(0.0, &dummy_err),
04711 &dummy_err));
04712 }
04713 #endif
04714
04715
04716 case MTYPE_C4:
04717 case MTYPE_C8:
04718 case MTYPE_CQ:
04719 case MTYPE_STR:
04720 return FALSE;
04721
04722 default:
04723 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(t)), "Targ_Is_Zero" );
04724 }
04725 return FALSE;
04726 }
04727
04728
04729
04730
04731
04732
04733
04734
04735
04736
04737 BOOL
04738 Targ_Is_Power_Of_Two ( TCON t )
04739 {
04740 INT64 cval;
04741 INT32 exponent, mant;
04742
04743 if ( Targ_Is_Integral ( t, &cval ) ) {
04744 if ( cval == 0 ) return FALSE;
04745 if ( cval == ( cval & ~(cval-1) ) ) return TRUE;
04746 }
04747
04748
04749 switch (TCON_ty(t)) {
04750 case MTYPE_F4:
04751 exponent = (TCON_v0(t) & 0x7f800000) >> 23;
04752 mant = TCON_v0(t) & 0x007fffff;
04753 return mant == 0 && exponent != 0 && exponent != 255;
04754
04755 case MTYPE_F8:
04756 exponent = (TCON_v1(t) & 0x7ff00000) >> 20;
04757 mant = (TCON_v1(t) & 0x000fffff) | TCON_v0(t);
04758 return mant==0 && exponent != 0 && exponent != 2047;
04759
04760 #ifdef TARG_NEEDS_QUAD_OPS
04761 case MTYPE_FQ:
04762
04763
04764
04765
04766
04767 exponent = (TCON_v1(t) & 0x7ff00000) >> 20;
04768 mant = (TCON_v1(t) & 0x000fffff) | TCON_v0(t) | TCON_v2(t) | TCON_v3(t);
04769 return mant==0 && exponent != 0 && exponent != 2047;
04770 #endif
04771 }
04772
04773 return FALSE;
04774 }
04775
04776
04777 #ifndef MONGOOSE_BE
04778
04779
04780
04781
04782
04783
04784
04785
04786
04787
04788
04789
04790
04791
04792 BOOL
04793 Targ_Contains_One_Bit_On ( TCON t, INT32 *onebit )
04794 {
04795 INT64 cval;
04796 INT32 i;
04797
04798 if ( Targ_Is_Integral ( t, &cval ) ) {
04799 if ( cval == 0 ) return FALSE;
04800 if ( cval != ( cval & ~(cval-1) ) ) return FALSE;
04801 for (i=0; i< 64; i++) {
04802 if (cval & 0x1 ) {
04803 if (onebit != NULL) *onebit = i;
04804 return TRUE;
04805 }
04806 cval = cval >> 1;
04807 }
04808 }
04809 return FALSE;
04810 }
04811
04812
04813
04814
04815
04816
04817
04818
04819
04820
04821
04822
04823 BOOL
04824 Targ_Determine_High_Bit ( TCON t, INT32 *highbit )
04825 {
04826 INT64 cval;
04827 INT32 i;
04828
04829 if ( Targ_Is_Integral ( t, &cval ) ) {
04830 UINT64 testbit;
04831 if ( cval == 0 ) return FALSE;
04832
04833 testbit = ((INT64)1) << MTYPE_size_min(TCON_ty(t))-1;
04834 for ( i = MTYPE_size_min(TCON_ty(t))-1; i >= 0; i-- ) {
04835 if ( (cval & testbit) != 0 ) {
04836 if ( highbit != NULL ) *highbit = i;
04837 return TRUE;
04838 }
04839
04840 testbit = testbit >> 1;
04841 }
04842 }
04843 return FALSE;
04844 }
04845 #endif
04846
04847
04848
04849
04850
04851
04852
04853
04854
04855
04856 UINT32
04857 Hash_TCON ( TCON * t, UINT32 modulus )
04858 {
04859 UINT32 hash = TCON_ty(*t);
04860 UINT32 rhash;
04861 INT32 i;
04862 char *s;
04863
04864 switch (TCON_ty(*t)) {
04865 case MTYPE_B:
04866 case MTYPE_I1:
04867 case MTYPE_I2:
04868 case MTYPE_I4:
04869 case MTYPE_U1:
04870 case MTYPE_U2:
04871 case MTYPE_U4:
04872 case MTYPE_F4:
04873 hash += TCON_v0(*t);
04874 break;
04875 case MTYPE_I8:
04876 case MTYPE_U8:
04877 case MTYPE_F8:
04878 hash += TCON_v0(*t) + TCON_v1(*t);
04879 break;
04880 case MTYPE_FQ:
04881 hash += TCON_v0(*t) + TCON_v1(*t) + TCON_v2(*t) + TCON_v3(*t);
04882 break;
04883 case MTYPE_C4:
04884 hash += TCON_v0(*t);
04885 hash += TCON_iv0(*t);
04886 break;
04887 case MTYPE_C8:
04888 hash += TCON_v0(*t) + TCON_v1(*t);
04889 hash += TCON_iv0(*t) + TCON_iv1(*t);
04890 break;
04891 case MTYPE_CQ:
04892 hash += TCON_v0(*t) + TCON_v1(*t) + TCON_v2(*t) + TCON_v3(*t);
04893 hash += TCON_iv0(*t) + TCON_iv1(*t) + TCON_iv2(*t) + TCON_iv3(*t);
04894 break;
04895 case MTYPE_STRING:
04896 s = Index_to_char_array (TCON_cp (*t));
04897 for ( i = 0; i < TCON_len(*t); i++, s++ ) {
04898 hash += (*s) << ((i % 4) * 8);
04899 }
04900 break;
04901 default:
04902 ErrMsg ( EC_Inv_Mtype, Mtype_Name(TCON_ty(*t)), "Hash_TCON" );
04903 return 0;
04904 }
04905
04906 if ( hash == 0 ) {
04907
04908 hash = MTYPE_LAST;
04909 }
04910 rhash = hash % modulus;
04911
04912 #ifdef Is_True_On
04913 if ( Get_Trace ( TP_MISC, 16 ) ) {
04914 fprintf ( TFile, "<tc> Hashing TCON ty=%d, %u mod %u = %u\n",
04915 TCON_ty(*t), hash, modulus, rhash );
04916 }
04917 #endif
04918
04919 return rhash;
04920 }
04921
04922
04923
04924
04925
04926
04927
04928
04929
04930
04931 #ifdef FRONT_END_FORTRAN
04932 BOOL Handle_Fortran_Constants(ND *t, TY *to_ty)
04933 {
04934 return FALSE;
04935 }
04936 #endif
04937
04938
04939
04940
04941
04942
04943
04944
04945
04946
04947 TCON Targ_IntrinsicOp ( UINT32 intrinsic, TCON c[], BOOL *folded)
04948 {
04949 TCON c0,t;
04950 *folded = TRUE;
04951
04952 c0 = c[0];
04953
04954
04955 #define DEG_TO_RAD (M_PI/180.0)
04956 #define RAD_TO_DEG (180.0/M_PI)
04957
04958 #ifdef QUAD_PRECISION_SUPPORTED
04959 #define M_PIL 3.141592653589793238462643383279531l
04960 #define DEG_TO_RADQ (M_PIL/180.0l)
04961 #define RAD_TO_DEGQ (180.0l/M_PIL)
04962 #endif
04963
04964 switch ((INTRINSIC) intrinsic) {
04965
04966 case INTRN_I4EXPEXPR:
04967 c0 = Targ_Power(c[0],c[1],folded,MTYPE_I4);
04968 break;
04969 case INTRN_I8EXPEXPR:
04970 c0 = Targ_Power(c[0],c[1],folded,MTYPE_I8);
04971 break;
04972 case INTRN_F4EXPEXPR:
04973 case INTRN_F4I4EXPEXPR:
04974 case INTRN_F4I8EXPEXPR:
04975 c0 = Targ_Power(c[0],c[1],folded,MTYPE_F4);
04976 break;
04977 case INTRN_F8EXPEXPR:
04978 case INTRN_F8I4EXPEXPR:
04979 case INTRN_F8I8EXPEXPR:
04980 c0 = Targ_Power(c[0],c[1],folded,MTYPE_F8);
04981 break;
04982 case INTRN_FQEXPEXPR:
04983 case INTRN_FQI4EXPEXPR:
04984 case INTRN_FQI8EXPEXPR:
04985 c0 = Targ_Power(c[0],c[1],folded,MTYPE_FQ);
04986 break;
04987 case INTRN_C4EXPEXPR:
04988 case INTRN_C4I4EXPEXPR:
04989 case INTRN_C4I8EXPEXPR:
04990 c0 = Targ_Power(c[0],c[1],folded,MTYPE_C4);
04991 break;
04992 case INTRN_C8EXPEXPR:
04993 case INTRN_C8I4EXPEXPR:
04994 case INTRN_C8I8EXPEXPR:
04995 c0 = Targ_Power(c[0],c[1],folded,MTYPE_C8);
04996 break;
04997 case INTRN_CQEXPEXPR:
04998 case INTRN_CQI4EXPEXPR:
04999 case INTRN_CQI8EXPEXPR:
05000 c0 = Targ_Power(c[0],c[1],folded,MTYPE_CQ);
05001 break;
05002
05003
05004 case INTRN_I1DIM:
05005 case INTRN_I2DIM:
05006 case INTRN_I4DIM:
05007 if (TCON_I4(c[0]) > TCON_I4(c[1])) {
05008 TCON_I4(c0) = TCON_I4(c[0]) - TCON_I4(c[1]);
05009 } else {
05010 TCON_I4(c0) = 0;
05011 }
05012 break;
05013 case INTRN_I8DIM:
05014 if (TCON_I8(c[0]) > TCON_I8(c[1])) {
05015 TCON_I8(c0) = TCON_I8(c[0]) - TCON_I8(c[1]);
05016 } else {
05017 TCON_I8(c0) = 0;
05018 }
05019 break;
05020
05021 case INTRN_I1SIGN:
05022 case INTRN_I2SIGN:
05023 case INTRN_I4SIGN:
05024 if (TCON_I4(c0) < 0) TCON_I4(c0) = -TCON_I4(c0);
05025 if (TCON_I4(c[1]) < 0) TCON_I4(c0) = -TCON_I4(c0);
05026 break;
05027
05028 case INTRN_I8SIGN:
05029 if (TCON_I8(c0) < 0) TCON_I8(c0) = -TCON_I8(c0);
05030 if (TCON_I8(c[1]) < 0) TCON_I8(c0) = -TCON_I8(c0);
05031 break;
05032
05033 case INTRN_F4SIGN:
05034 c0 = Targ_WhirlOp(OPC_F4ABS,c0,c0,folded);
05035 if (TCON_R4(c[1]) < 0) TCON_R4(c0) = -TCON_R4(c0);
05036 break;
05037
05038 case INTRN_F8SIGN:
05039 c0 = Targ_WhirlOp(OPC_F8ABS,c0,c0,folded);
05040 if (TCON_R8(c[1]) < 0) TCON_R8(c0) = -TCON_R8(c0);
05041 break;
05042
05043 case INTRN_FQSIGN:
05044 c0 = Targ_WhirlOp(OPC_FQABS,c0,c0,folded);
05045 t = Targ_WhirlOp(OPC_I4FQLT,c[1],Quad_Zero_Tcon,folded);
05046 if (TCON_I4(t)) c0 = Targ_WhirlOp(OPC_FQNEG,c0,c0,folded);
05047 break;
05048
05049
05050 case INTRN_I2F4NINT:
05051 c0 = Targ_Conv(MTYPE_I2,Targ_WhirlOp(OPC_I4F4RND,c[0],c[0],folded));
05052 break;
05053
05054 case INTRN_I4F4NINT:
05055 c0 = Targ_WhirlOp(OPC_I4F4RND,c[0],c[0],folded);
05056 break;
05057
05058 case INTRN_I8F4NINT:
05059 c0 = Targ_WhirlOp(OPC_I8F4RND,c[0],c[0],folded);
05060 break;
05061
05062 case INTRN_I2F8IDNINT:
05063 c0 = Targ_Conv(MTYPE_I2,Targ_WhirlOp(OPC_I4F8RND,c[0],c[0],folded));
05064 break;
05065
05066 case INTRN_I4F8IDNINT:
05067 c0 = Targ_WhirlOp(OPC_I4F8RND,c[0],c[0],folded);
05068 break;
05069
05070 case INTRN_I8F8IDNINT:
05071 c0 = Targ_WhirlOp(OPC_I8F8RND,c[0],c[0],folded);
05072 break;
05073
05074 case INTRN_I2FQIQNINT:
05075 c0 = Targ_Conv(MTYPE_I2,Targ_WhirlOp(OPC_I4FQRND,c[0],c[0],folded));
05076 break;
05077
05078 case INTRN_I4FQIQNINT:
05079 c0 = Targ_WhirlOp(OPC_I4FQRND,c[0],c[0],folded);
05080 break;
05081
05082 case INTRN_I8FQIQNINT:
05083 c0 = Targ_WhirlOp(OPC_I8FQRND,c[0],c[0],folded);
05084 break;
05085
05086 case INTRN_I1BITS:
05087 case INTRN_I2BITS:
05088 case INTRN_I4BITS:
05089 {
05090 INT64 mask,bits,one=1;
05091 mask = (one << TCON_U4(c[2])) - 1;
05092 bits = TCON_U4(c0) >> TCON_U4(c[1]);
05093 TCON_U4(c0) = mask & bits;
05094 }
05095 break;
05096
05097 case INTRN_I8BITS:
05098 {
05099 INT64 mask,bits,one=1;
05100 mask = (one << TCON_U8(c[2])) - 1;
05101 bits = TCON_U8(c0) >> TCON_U8(c[1]);
05102 TCON_U8(c0) = mask & bits;
05103 }
05104 break;
05105
05106 case INTRN_I1BSET:
05107 case INTRN_I2BSET:
05108 case INTRN_I4BSET:
05109 TCON_I4(c0) |= (1 << TCON_I4(c[1]));
05110 break;
05111
05112 case INTRN_I8BSET:
05113 {
05114 INT64 one=1;
05115 TCON_I8(c0) |= (one << TCON_I8(c[1]));
05116 }
05117 break;
05118
05119 case INTRN_I1BCLR:
05120 case INTRN_I2BCLR:
05121 case INTRN_I4BCLR:
05122 TCON_I4(c0) &= ~(1 << TCON_I4(c[1]));
05123 break;
05124
05125 case INTRN_I8BCLR:
05126 {
05127 INT64 one=1;
05128 TCON_I8(c0) &= ~(one << TCON_I8(c[1]));
05129 }
05130 break;
05131
05132 case INTRN_I1BTEST:
05133 case INTRN_I2BTEST:
05134 case INTRN_I4BTEST:
05135 {
05136 INT32 test;
05137 test = TCON_I4(c0) & (1<<TCON_I4(c[1]));
05138 TCON_I4(c0) = (test != 0); TCON_v1(c0) = 0;
05139 TCON_ty(c0) = LOGICAL_MTYPE;
05140 }
05141 break;
05142
05143 case INTRN_I8BTEST:
05144 {
05145 INT64 test,one=1;
05146 test = TCON_I8(c0) & (one<<TCON_I8(c[1]));
05147 TCON_I4(c0) = (test != 0); TCON_v1(c0) = 0;
05148 TCON_ty(c0) = LOGICAL_MTYPE;
05149 }
05150 break;
05151
05152 case INTRN_I1SHL:
05153 TCON_I4(c0) = (TCON_I4(c0) << TCON_I4(c[1]))&0xff;
05154 break;
05155
05156 case INTRN_I2SHL:
05157 TCON_I4(c0) = (TCON_I4(c0) << TCON_I4(c[1]))&0xffff;
05158 break;
05159
05160 case INTRN_I1SHFT:
05161 if (TCON_I4(c[1]) >= 0) {
05162 TCON_I4(c0) <<= TCON_I4(c[1]);
05163 } else {
05164 TCON_U4(c0) >>= (-TCON_I4(c[1]));
05165 }
05166 TCON_U4(c0) &= 0xff;
05167 break;
05168
05169 case INTRN_I2SHFT:
05170 if (TCON_I4(c[1]) >= 0) {
05171 TCON_I4(c0) <<= TCON_I4(c[1]);
05172 } else {
05173 TCON_U4(c0) >>= (-TCON_I4(c[1]));
05174 }
05175 TCON_U4(c0) &= 0xffff;
05176 break;
05177
05178 case INTRN_I4SHFT:
05179 if (TCON_I4(c[1]) >= 0) {
05180 TCON_I4(c0) <<= TCON_I4(c[1]);
05181 } else {
05182 TCON_U4(c0) >>= (-TCON_I4(c[1]));
05183 }
05184 break;
05185
05186 case INTRN_I8SHFT:
05187 if (TCON_I8(c[1]) >= 0) {
05188 TCON_I8(c0) <<= TCON_I8(c[1]);
05189 } else {
05190 TCON_U8(c0) >>= (-TCON_I8(c[1]));
05191 }
05192 break;
05193
05194 case INTRN_I1SHFTC:
05195 case INTRN_I2SHFTC:
05196 case INTRN_I4SHFTC:
05197 {
05198 UINT32 mask,size,t,sl,sr;
05199 size = TCON_I4(c[2]);
05200 if (size == 32) {
05201 mask = (UINT32)-1;
05202 } else {
05203 mask = (1U << size) - 1;
05204 }
05205 if (TCON_I4(c[1]) >= 0) {
05206 sl = TCON_I4(c[1]);
05207 } else {
05208 sl = size + TCON_I4(c[1]);
05209 }
05210 sr = size - sl;
05211 t = TCON_I4(c0) & mask;
05212 t = ((t >> sl) | (t << sr)) & mask;
05213 TCON_I4(c0) = t | (TCON_I4(c0) & (~mask));
05214 }
05215 break;
05216
05217
05218 case INTRN_I8SHFTC:
05219 {
05220 UINT64 mask,size,t,sl,sr;
05221 size = TCON_I8(c[2]);
05222 if (size==64) {
05223 mask = (UINT64)-1;
05224 } else {
05225 mask = (1ULL << size) - 1;
05226 }
05227 if (TCON_I8(c[1]) >= 0) {
05228 sl = TCON_I8(c[1]);
05229 } else {
05230 sl = size + TCON_I8(c[1]);
05231 }
05232 sr = size - sl;
05233 t = TCON_I8(c0) & mask;
05234 t = ((t >> sl) | (t << sr)) & mask;
05235 TCON_I8(c0) = t | (TCON_I8(c0) & (~mask));
05236 }
05237 break;
05238
05239 case INTRN_I8DIVFLOOR:
05240 if (TCON_I8(c[1]) == 0) {
05241 *folded = FALSE;
05242 } else {
05243 INT64 q,sign;
05244 q = TCON_I8(c[0]) / TCON_I8(c[1]);
05245 sign = TCON_I8(c[0]) ^ TCON_I8(c[1]);
05246 if (sign < 0 && q*TCON_I8(c[1]) != TCON_I8(c[0])) {
05247 q -= 1;
05248 }
05249 TCON_I8(c0) = q;
05250 }
05251 break;
05252
05253 case INTRN_I4DIVFLOOR:
05254 if (TCON_I4(c[1]) == 0) {
05255 *folded = FALSE;
05256 } else {
05257 INT32 q,sign;
05258 q = TCON_I4(c[0]) / TCON_I4(c[1]);
05259 sign = TCON_I4(c[0]) ^ TCON_I4(c[1]);
05260 if (sign < 0 && q*TCON_I4(c[1]) != TCON_I4(c[0])) {
05261 q -= 1;
05262 }
05263 TCON_I4(c0) = q;
05264 }
05265 break;
05266
05267 case INTRN_U8DIVFLOOR:
05268 if (TCON_U8(c[1]) == 0) {
05269 *folded = FALSE;
05270 } else {
05271 TCON_U8(c0) = TCON_U8(c[0]) / TCON_U8(c[1]);
05272 }
05273 break;
05274
05275 case INTRN_U4DIVFLOOR:
05276 if (TCON_U4(c[1]) == 0) {
05277 *folded = FALSE;
05278 } else {
05279 TCON_U4(c0) = TCON_U4(c[0]) / TCON_U4(c[1]);
05280 }
05281 break;
05282
05283 case INTRN_I8DIVCEIL:
05284 if (TCON_I8(c[1]) == 0) {
05285 *folded = FALSE;
05286 } else {
05287 INT64 q,sign;
05288 q = TCON_I8(c[0]) / TCON_I8(c[1]);
05289 sign = TCON_I8(c[0]) ^ TCON_I8(c[1]);
05290 if (sign >= 0 && q*TCON_I8(c[1]) != TCON_I8(c[0])) {
05291 q += 1;
05292 }
05293 TCON_I8(c0) = q;
05294 }
05295 break;
05296
05297 case INTRN_I4DIVCEIL:
05298 if (TCON_I4(c[1]) == 0) {
05299 *folded = FALSE;
05300 } else {
05301 INT32 q,sign;
05302 q = TCON_I4(c[0]) / TCON_I4(c[1]);
05303 sign = TCON_I4(c[0]) ^ TCON_I4(c[1]);
05304 if (sign >= 0 && q*TCON_I4(c[1]) != TCON_I4(c[0])) {
05305 q += 1;
05306 }
05307 TCON_I4(c0) = q;
05308 }
05309 break;
05310
05311 case INTRN_U8DIVCEIL:
05312 if (TCON_U8(c[1]) == 0) {
05313 *folded = FALSE;
05314 } else {
05315 UINT64 q;
05316 q = TCON_U8(c[0]) / TCON_U8(c[1]);
05317 if (q*TCON_U8(c[1]) != TCON_U8(c[0])) {
05318 q += 1;
05319 }
05320 TCON_U8(c0) = q;
05321 }
05322 break;
05323
05324 case INTRN_U4DIVCEIL:
05325 if (TCON_U4(c[1]) == 0) {
05326 *folded = FALSE;
05327 } else {
05328 UINT32 q;
05329 q = TCON_U4(c[0]) / TCON_U4(c[1]);
05330 if (q*TCON_U4(c[1]) != TCON_U4(c[0])) {
05331 q += 1;
05332 }
05333 TCON_U4(c0) = q;
05334 }
05335 break;
05336
05337
05338 case INTRN_F4DIM:
05339 if (TCON_R4(c[0]) > TCON_R4(c[1])) {
05340 TCON_R4(c0) = TCON_R4(c[0]) - TCON_R4(c[1]);
05341 } else {
05342 TCON_R4(c0) = 0.0;
05343 }
05344 break;
05345
05346 case INTRN_F8DIM:
05347 if (TCON_R8(c[0]) > TCON_R8(c[1])) {
05348 TCON_R8(c0) = TCON_R8(c[0]) - TCON_R8(c[1]);
05349 } else {
05350 TCON_R8(c0) = 0.0;
05351 }
05352 break;
05353
05354 case INTRN_FQDIM:
05355 c0 = Targ_WhirlOp(OPC_FQSUB,c0,c[1],folded);
05356 t = Targ_WhirlOp(OPC_I4FQLT,c0,Quad_Zero_Tcon,folded);
05357 if (TCON_I4(t)) c0 = Quad_Zero_Tcon;
05358 break;
05359
05360
05361 case INTRN_F4AINT:
05362 t = Targ_WhirlOp(OPC_F4ABS,c[0],c[0],folded);
05363 if ((INT32) TCON_R4(t) < (1<<30)) {
05364 TCON_R4(c0) = (INT32) TCON_R4(c0);
05365 }
05366 break;
05367
05368 case INTRN_F8AINT:
05369 t = Targ_WhirlOp(OPC_F8ABS,c[0],c[0],folded);
05370 if ((INT64) TCON_R8(t) < (1LL << 62)) {
05371 TCON_R8(c0) = (INT64) TCON_R8(c0);
05372 }
05373 break;
05374
05375 case INTRN_F4ANINT:
05376 if (TCON_R4(c0) < 0) {
05377 TCON_R4(c0) -= 0.5;
05378 } else {
05379 TCON_R4(c0) += 0.5;
05380 }
05381 c0 = Targ_IntrinsicOp(INTRN_F4AINT,&c0,folded);
05382 break;
05383 case INTRN_F8ANINT:
05384 if (TCON_R8(c0) < 0) {
05385 TCON_R8(c0) -= 0.5;
05386 } else {
05387 TCON_R8(c0) += 0.5;
05388 }
05389 c0 = Targ_IntrinsicOp(INTRN_F8AINT,&c0,folded);
05390 break;
05391
05392 case INTRN_F4EXP:
05393 TCON_R4(c0) = expf(TCON_R4(c0));
05394 break;
05395 case INTRN_F8EXP:
05396 TCON_R8(c0) = exp(TCON_R8(c0));
05397 break;
05398
05399 case INTRN_F4LOG:
05400 TCON_R4(c0) = logf(TCON_R4(c0));
05401 break;
05402 case INTRN_F8LOG:
05403 TCON_R8(c0) = log(TCON_R8(c0));
05404 break;
05405
05406 case INTRN_F4LOG10:
05407 TCON_R4(c0) = log10f(TCON_R4(c0));
05408 break;
05409 case INTRN_F8LOG10:
05410 TCON_R8(c0) = log10(TCON_R8(c0));
05411 break;
05412
05413 case INTRN_F4COS:
05414 TCON_R4(c0) = cosf(TCON_R4(c0));
05415 break;
05416 case INTRN_F8COS:
05417 TCON_R8(c0) = cos(TCON_R8(c0));
05418 break;
05419
05420 case INTRN_F4SIN:
05421 TCON_R4(c0) = sinf(TCON_R4(c0));
05422 break;
05423 case INTRN_F8SIN:
05424 TCON_R8(c0) = sin(TCON_R8(c0));
05425 break;
05426
05427 case INTRN_F4TAN:
05428 TCON_R4(c0) = tanf(TCON_R4(c0));
05429 break;
05430 case INTRN_F8TAN:
05431 TCON_R8(c0) = tan(TCON_R8(c0));
05432 break;
05433
05434 case INTRN_F4COSD:
05435 TCON_R4(c0) = cosf(DEG_TO_RAD*TCON_R4(c0));
05436 break;
05437 case INTRN_F8COSD:
05438 TCON_R8(c0) = cos(DEG_TO_RAD*TCON_R8(c0));
05439 break;
05440
05441 case INTRN_F4SIND:
05442 TCON_R4(c0) = sinf(DEG_TO_RAD*TCON_R4(c0));
05443 break;
05444 case INTRN_F8SIND:
05445 TCON_R8(c0) = sin(DEG_TO_RAD*TCON_R8(c0));
05446 break;
05447
05448 case INTRN_F4TAND:
05449 TCON_R4(c0) = tanf(DEG_TO_RAD*TCON_R4(c0));
05450 break;
05451 case INTRN_F8TAND:
05452 TCON_R8(c0) = tan(DEG_TO_RAD*TCON_R8(c0));
05453 break;
05454
05455
05456 case INTRN_F4ACOS:
05457 TCON_R4(c0) = acosf(TCON_R4(c0));
05458 break;
05459 case INTRN_F8ACOS:
05460 TCON_R8(c0) = acos(TCON_R8(c0));
05461 break;
05462
05463 case INTRN_F4ASIN:
05464 TCON_R4(c0) = asinf(TCON_R4(c0));
05465 break;
05466 case INTRN_F8ASIN:
05467 TCON_R8(c0) = asin(TCON_R8(c0));
05468 break;
05469
05470 case INTRN_F4ATAN:
05471 TCON_R4(c0) = atanf(TCON_R4(c0));
05472 break;
05473 case INTRN_F8ATAN:
05474 TCON_R8(c0) = atan(TCON_R8(c0));
05475 break;
05476
05477 case INTRN_F4ACOSD:
05478 TCON_R4(c0) = RAD_TO_DEG*acosf(TCON_R4(c0));
05479 break;
05480 case INTRN_F8ACOSD:
05481 TCON_R8(c0) = RAD_TO_DEG*acos(TCON_R8(c0));
05482 break;
05483
05484 case INTRN_F4ASIND:
05485 TCON_R4(c0) = RAD_TO_DEG*asinf(TCON_R4(c0));
05486 break;
05487 case INTRN_F8ASIND:
05488 TCON_R8(c0) = RAD_TO_DEG*asin(TCON_R8(c0));
05489 break;
05490
05491 case INTRN_F4ATAND:
05492 TCON_R4(c0) = RAD_TO_DEG*atanf(TCON_R4(c0));
05493 break;
05494 case INTRN_F8ATAND:
05495 TCON_R8(c0) = RAD_TO_DEG*atan(TCON_R8(c0));
05496 break;
05497
05498 case INTRN_F4COSH:
05499 TCON_R4(c0) = coshf(TCON_R4(c0));
05500 break;
05501 case INTRN_F8COSH:
05502 TCON_R8(c0) = cosh(TCON_R8(c0));
05503 break;
05504
05505 case INTRN_F4SINH:
05506 TCON_R4(c0) = sinhf(TCON_R4(c0));
05507 break;
05508 case INTRN_F8SINH:
05509 TCON_R8(c0) = sinh(TCON_R8(c0));
05510 break;
05511
05512 case INTRN_F4TANH:
05513 TCON_R4(c0) = tanhf(TCON_R4(c0));
05514 break;
05515 case INTRN_F8TANH:
05516 TCON_R8(c0) = tanh(TCON_R8(c0));
05517 break;
05518
05519 case INTRN_F4ATAN2:
05520 TCON_R4(c0) = atan2f(TCON_R4(c0),TCON_R4(c[1]));
05521 break;
05522 case INTRN_F8ATAN2:
05523 TCON_R8(c0) = atan2(TCON_R8(c0),TCON_R8(c[1]));
05524 break;
05525
05526 case INTRN_F4ATAN2D:
05527 TCON_R4(c0) = RAD_TO_DEG*atan2f(TCON_R4(c0),TCON_R4(c[1]));
05528 break;
05529 case INTRN_F8ATAN2D:
05530 TCON_R8(c0) = RAD_TO_DEG*atan2(TCON_R8(c0),TCON_R8(c[1]));
05531 break;
05532
05533 case INTRN_F4CIS:
05534 TCON_ty(c0) = MTYPE_C4;
05535 TCON_R4(c0) = cosf(TCON_R4(c[0]));
05536 TCON_IR4(c0) = sinf(TCON_R4(c[0]));
05537 break;
05538
05539 case INTRN_F8CIS:
05540 TCON_ty(c0) = MTYPE_C8;
05541 TCON_R8(c0) = cos(TCON_R8(c[0]));
05542 TCON_IR8(c0) = sin(TCON_R8(c[0]));
05543 break;
05544
05545 #ifdef QUAD_PRECISION_SUPPORTED
05546
05547
05548 case INTRN_FQEXP:
05549 TCON_R16(c0) = RLD_To_R16(expl(R16_To_RLD(TCON_R16(c0))));
05550 break;
05551 case INTRN_FQLOG:
05552 TCON_R16(c0) = RLD_To_R16(logl(R16_To_RLD(TCON_R16(c0))));
05553 break;
05554 case INTRN_FQLOG10:
05555 TCON_R16(c0) = RLD_To_R16(log10l(R16_To_RLD(TCON_R16(c0))));
05556 break;
05557 case INTRN_FQCOS:
05558 TCON_R16(c0) = RLD_To_R16(cosl(R16_To_RLD(TCON_R16(c0))));
05559 break;
05560 case INTRN_FQSIN:
05561 TCON_R16(c0) = RLD_To_R16(sinl(R16_To_RLD(TCON_R16(c0))));
05562 break;
05563 case INTRN_FQTAN:
05564 TCON_R16(c0) = RLD_To_R16(tanl(R16_To_RLD(TCON_R16(c0))));
05565 break;
05566 case INTRN_FQCOSD:
05567 TCON_R16(c0) = RLD_To_R16(cosl(DEG_TO_RADQ*R16_To_RLD(TCON_R16(c0))));
05568 break;
05569 case INTRN_FQSIND:
05570 TCON_R16(c0) = RLD_To_R16(sinl(DEG_TO_RADQ*R16_To_RLD(TCON_R16(c0))));
05571 break;
05572 case INTRN_FQTAND:
05573 TCON_R16(c0) = RLD_To_R16(tanl(DEG_TO_RADQ*R16_To_RLD(TCON_R16(c0))));
05574 break;
05575 case INTRN_FQCOSH:
05576 TCON_R16(c0) = RLD_To_R16(coshl(R16_To_RLD(TCON_R16(c0))));
05577 break;
05578 case INTRN_FQSINH:
05579 TCON_R16(c0) = RLD_To_R16(sinhl(R16_To_RLD(TCON_R16(c0))));
05580 break;
05581 case INTRN_FQTANH:
05582 TCON_R16(c0) = RLD_To_R16(tanhl(R16_To_RLD(TCON_R16(c0))));
05583 break;
05584 case INTRN_FQACOS:
05585 TCON_R16(c0) = RLD_To_R16(acosl(R16_To_RLD(TCON_R16(c0))));
05586 break;
05587 case INTRN_FQASIN:
05588 TCON_R16(c0) = RLD_To_R16(asinl(R16_To_RLD(TCON_R16(c0))));
05589 break;
05590 case INTRN_FQATAN:
05591 TCON_R16(c0) = RLD_To_R16(atanl(R16_To_RLD(TCON_R16(c0))));
05592 break;
05593 case INTRN_FQACOSD:
05594 TCON_R16(c0) = RLD_To_R16(RAD_TO_DEGQ*acosl(R16_To_RLD(TCON_R16(c0))));
05595 break;
05596 case INTRN_FQASIND:
05597 TCON_R16(c0) = RLD_To_R16(RAD_TO_DEGQ*asinl(R16_To_RLD(TCON_R16(c0))));
05598 break;
05599 case INTRN_FQATAND:
05600 TCON_R16(c0) = RLD_To_R16(RAD_TO_DEGQ*atanl(R16_To_RLD(TCON_R16(c0))));
05601 break;
05602 case INTRN_FQATAN2:
05603 TCON_R16(c0) = RLD_To_R16(atan2l(R16_To_RLD(TCON_R16(c0)),R16_To_RLD(TCON_R16(c[1]))));
05604 break;
05605 case INTRN_FQATAN2D:
05606 TCON_R16(c0) = RLD_To_R16(RAD_TO_DEGQ*atan2l(R16_To_RLD(TCON_R16(c0)),R16_To_RLD(TCON_R16(c[1]))));
05607 break;
05608
05609 case INTRN_FQCIS:
05610 TCON_ty(c0) = MTYPE_CQ;
05611 TCON_R16(c0) = RLD_To_R16(cosl(R16_To_RLD(TCON_R16(c[0]))));
05612 TCON_IR16(c0) = RLD_To_R16(sinl(R16_To_RLD(TCON_R16(c[0]))));
05613 break;
05614
05615 case INTRN_FQAINT:
05616 TCON_R16(c0) = RLD_To_R16(truncl(R16_To_RLD(TCON_R16(c0))));
05617 break;
05618
05619 case INTRN_FQANINT:
05620 if (R16_To_RLD(TCON_R16(c0)) < 0) {
05621 TCON_R16(c0) = RLD_To_R16(truncl(R16_To_RLD(TCON_R16(c0))-0.5l));
05622 } else {
05623 TCON_R16(c0) = RLD_To_R16(truncl(R16_To_RLD(TCON_R16(c0))+0.5l));
05624 }
05625 break;
05626
05627
05628 case INTRN_C4COS:
05629 case INTRN_C8COS:
05630 case INTRN_C4SIN:
05631 case INTRN_C8SIN:
05632 case INTRN_C4EXP:
05633 case INTRN_C8EXP:
05634 case INTRN_C4LOG:
05635 case INTRN_C8LOG:
05636 case INTRN_CQEXP:
05637 case INTRN_CQLOG:
05638 case INTRN_CQCOS:
05639 case INTRN_CQSIN:
05640 case INTRN_F8F4PROD:
05641 case INTRN_FQF8PROD:
05642 *folded = FALSE;
05643 break;
05644
05645 #else
05646
05647 case INTRN_FQAINT:
05648 case INTRN_FQANINT:
05649 case INTRN_FQEXP:
05650 case INTRN_FQLOG:
05651 case INTRN_FQLOG10:
05652 case INTRN_FQCOS:
05653 case INTRN_FQSIN:
05654 case INTRN_FQCIS:
05655 case INTRN_FQTAN:
05656 case INTRN_FQCOSD:
05657 case INTRN_FQSIND:
05658 case INTRN_FQTAND:
05659 case INTRN_FQCOSH:
05660 case INTRN_FQSINH:
05661 case INTRN_FQTANH:
05662 case INTRN_FQACOS:
05663 case INTRN_FQASIN:
05664 case INTRN_FQATAN:
05665 case INTRN_FQACOSD:
05666 case INTRN_FQASIND:
05667 case INTRN_FQATAND:
05668 case INTRN_FQATAN2:
05669 case INTRN_FQATAN2D:
05670
05671
05672 case INTRN_C4COS:
05673 case INTRN_C8COS:
05674 case INTRN_C4SIN:
05675 case INTRN_C8SIN:
05676 case INTRN_C4EXP:
05677 case INTRN_C8EXP:
05678 case INTRN_C4LOG:
05679 case INTRN_C8LOG:
05680 case INTRN_CQEXP:
05681 case INTRN_CQLOG:
05682 case INTRN_CQCOS:
05683 case INTRN_CQSIN:
05684 case INTRN_F8F4PROD:
05685 case INTRN_FQF8PROD:
05686 *folded = FALSE;
05687 break;
05688 #endif
05689
05690 case INTRN_I1POPCNT:
05691 case INTRN_I2POPCNT:
05692 case INTRN_I4POPCNT:
05693 case INTRN_I8POPCNT:
05694 {
05695 INT64 count;
05696 INT i,numbits;
05697 INT64 val;
05698 switch (intrinsic) {
05699 case INTRN_I1POPCNT:
05700 numbits = 8;
05701 val = TCON_I4(c0);
05702 break;
05703 case INTRN_I2POPCNT:
05704 numbits = 16;
05705 val = TCON_I4(c0);
05706 break;
05707 case INTRN_I4POPCNT:
05708 numbits = 32;
05709 val = TCON_I4(c0);
05710 break;
05711 case INTRN_I8POPCNT:
05712 numbits = 64;
05713 val = TCON_I8(c0);
05714 break;
05715 }
05716 count = 0;
05717 for (i = 0; i < numbits; i++) {
05718 count += (val & 1);
05719 val >>= 1;
05720 }
05721 TCON_I4(c0) = count;
05722 TCON_ty(c0) = MTYPE_I4;
05723 }
05724 break;
05725
05726 case INTRN_I1LEADZ:
05727 case INTRN_I2LEADZ:
05728 case INTRN_I4LEADZ:
05729 case INTRN_I8LEADZ:
05730 {
05731 INT64 count;
05732 INT i,numbits;
05733 INT64 val;
05734 switch (intrinsic) {
05735 case INTRN_I1LEADZ:
05736 numbits = 8;
05737 val = TCON_I4(c0);
05738 val <<= 56;
05739 break;
05740 case INTRN_I2LEADZ:
05741 numbits = 16;
05742 val = TCON_I4(c0);
05743 val <<= 48;
05744 break;
05745 case INTRN_I4LEADZ:
05746 numbits = 32;
05747 val = TCON_I4(c0);
05748 val <<= 32;
05749 break;
05750 case INTRN_I8LEADZ:
05751 numbits = 64;
05752 val = TCON_I8(c0);
05753 break;
05754 }
05755 count = 0;
05756 for (i = 0; i < numbits; i++) {
05757 if (val >= 0) {
05758 ++count;
05759 val <<= 1;
05760 } else {
05761 break;
05762 }
05763 }
05764 TCON_I4(c0) = count;
05765 TCON_ty(c0) = MTYPE_I4;
05766 }
05767 break;
05768
05769 default:
05770 *folded = FALSE;
05771 break;
05772 }
05773 return (c0);
05774 }
05775