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