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 #define TRACE_ENTRY(x)
00047 #define TRACE_EXIT(x)
00048 #define TRACE_EXIT_i(x,i)
00049
00050 #include <limits.h>
00051 #include "defs.h"
00052 #include "mtypes.h"
00053 #include "errors.h"
00054 #include "erglob.h"
00055 #include "stab.h"
00056 #include "config_targ.h"
00057 #include "targ_sim.h"
00058
00059 #include "targ_sim_body.h"
00060
00061
00062 #define I0 (Int_Preg_Min_Offset - 1)
00063 #define F0 Float_Preg_Min_Offset
00064
00065 #if (__GNUC__ == 2)
00066 static
00067 #endif
00068 SIM SIM_Info[] = {
00069
00070
00071
00072
00073
00074
00075 {
00076 0,
00077 {0,0,0}, {0,0,0}, {0,0,0},
00078 {0,0,0}, {0,0,0}, {0,0,0},
00079 0, 0, 0,
00080 0, 0, 0,
00081 0, 0, 0, 0
00082 },
00083 {
00084 SIM_FLT_AFTER_INT | SIM_COORD_MEM_REG | SIM_COORD_INT_FLT
00085 | SIM_REG_STRUCTS | SIM_FLT_RTN_COMPLEX | SIM_DBL_REG_FIELDS ,
00086 #if defined(TARG_SL)
00087
00088
00089 {I0+4,I0+11,1}, {F0+6,F0+9,1}, {F0+6,F0+9,1},
00090 #else
00091 {I0+4,I0+11,1}, {F0+12,F0+19,1}, {F0+12,F0+19,1},
00092 #endif
00093 {I0+2,I0+3,1}, {I0+2, I0+3, 1}, {I0+2, I0+3,2},
00094 MTYPE_I4, MTYPE_F8, MTYPE_F8,
00095 0, 64, -64,
00096 -1, 64, I0+2, I0+25
00097 },
00098 {
00099 SIM_FLT_AFTER_INT | SIM_COORD_MEM_REG | SIM_COORD_INT_FLT
00100 | SIM_REG_STRUCTS | SIM_FLT_RTN_COMPLEX | SIM_DBL_REG_FIELDS ,
00101 #if defined(TARG_SL)
00102 {I0+4,I0+11,1}, {F0+6,F0+9,1}, {F0+6,F0+9,1},
00103 #else
00104 {I0+4,I0+11,1}, {F0+12,F0+19,1}, {F0+12,F0+19,1},
00105 #endif
00106 {I0+2,I0+3,1}, {F0,F0+2,2}, {F0,F0+2,2},
00107 MTYPE_I8, MTYPE_F8, MTYPE_F8,
00108 0, 64, -64,
00109 -1, 128, I0+2, I0+25
00110 }
00111 };
00112
00113
00114 extern BOOL
00115 Is_Return_Preg (PREG_NUM preg)
00116 {
00117 return (preg >= First_Int_Preg_Return_Offset
00118 && preg <= Last_Int_Preg_Return_Offset)
00119 || (preg >= First_Float_Preg_Return_Offset
00120 && preg <= Last_Float_Preg_Return_Offset);
00121 }
00122
00123
00124 extern BOOL
00125 Is_Int_Output_Preg (PREG_NUM preg)
00126 {
00127 Fail_FmtAssertion (
00128 ("Is_Int_Output_Preg not applicable to MIPS targets"));
00129 }
00130
00131
00132 extern BOOL
00133 Is_Formal_Preg (PREG_NUM preg)
00134 {
00135 return (preg >= First_Int_Preg_Param_Offset
00136 && preg <= (First_Int_Preg_Param_Offset
00137 + MAX_NUMBER_OF_REGISTER_PARAMETERS) )
00138 || (preg >= First_Float_Preg_Param_Offset
00139 && preg <= (First_Float_Preg_Param_Offset
00140 + MAX_NUMBER_OF_REGISTER_PARAMETERS) );
00141 }
00142
00143
00144 static BOOL
00145 Struct_Has_One_Float (const TY_IDX ty, TYPE_ID &ftype)
00146 {
00147 if (TY_is_union (ty))
00148 return FALSE;
00149
00150 if (TY_fld (ty).Is_Null ())
00151 return FALSE;
00152
00153 FLD_HANDLE fld = TY_fld (ty);
00154
00155 if (FLD_last_field (fld) && FLD_type (fld) != 0 &&
00156 TY_kind (FLD_type (fld)) == KIND_SCALAR) {
00157 ftype = TY_mtype (FLD_type (fld));
00158 if (MTYPE_float (ftype))
00159 return TRUE;
00160 }
00161 ftype = MTYPE_V;
00162 return FALSE;
00163 }
00164
00165
00166
00167 static BOOL
00168 no_overlap (const FLD_HANDLE fld1, const FLD_HANDLE fld2)
00169 {
00170 if (FLD_ofst (fld1) <= FLD_ofst (fld2))
00171 return FLD_ofst(fld1) + TY_size (FLD_type (fld1)) <= FLD_ofst (fld2);
00172 else
00173 return FLD_ofst(fld2) + TY_size (FLD_type (fld2)) <= FLD_ofst (fld1);
00174 }
00175
00176 static BOOL
00177 Struct_Has_Two_Floats (const TY_IDX ty, TYPE_ID& ftype1, TYPE_ID& ftype2)
00178 {
00179 if (TY_is_union (ty))
00180 return FALSE;
00181
00182 if (TY_fld (ty).Is_Null ())
00183 return FALSE;
00184
00185 FLD_HANDLE fld1 = TY_fld (ty);
00186
00187 if (FLD_last_field (fld1))
00188 return FALSE;
00189
00190 FLD_HANDLE fld2 (FLD_next (fld1));
00191
00192 if (FLD_last_field (fld2) &&
00193 FLD_type (fld1) != 0 && TY_kind (FLD_type (fld1)) == KIND_SCALAR &&
00194 FLD_type (fld2) != 0 && TY_kind (FLD_type (fld2)) == KIND_SCALAR &&
00195 no_overlap (fld1, fld2)) {
00196 ftype1 = TY_mtype (FLD_type(fld1));
00197 ftype2 = TY_mtype (FLD_type(fld2));
00198 if (MTYPE_float (ftype1) && MTYPE_float (ftype2))
00199 return TRUE;
00200 }
00201 ftype1 = ftype2 = MTYPE_V;
00202 return FALSE;
00203
00204 }
00205
00206 static BOOL
00207 Is_Simulated_Type (TYPE_ID mtype)
00208 {
00209 switch (mtype) {
00210 case MTYPE_FQ: return TRUE;
00211 case MTYPE_C4: return TRUE;
00212 case MTYPE_C8: return TRUE;
00213 case MTYPE_CQ: return TRUE;
00214 default: return FALSE;
00215 }
00216 }
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 extern void
00227 Get_Return_Mtypes (
00228 TY_IDX rtype,
00229 Mtype_Return_Level level,
00230 TYPE_ID *mreg1,
00231 TYPE_ID *mreg2)
00232 {
00233 Fail_FmtAssertion (
00234 ("Get_Return_Mtypes should not be invoked; invoke Get_Return_Info instead"));
00235 }
00236
00237
00238
00239
00240
00241
00242
00243 extern void
00244 Get_Return_Pregs (
00245 TYPE_ID mreg1,
00246 TYPE_ID mreg2,
00247 PREG_NUM *rreg1,
00248 PREG_NUM *rreg2)
00249 {
00250 Fail_FmtAssertion (
00251 ("Get_Return_Pregs should not be invoked; invoke Get_Return_Info instead"));
00252 }
00253
00254 RETURN_INFO
00255 Get_Return_Info (TY_IDX rtype, Mtype_Return_Level level)
00256 {
00257 TYPE_ID mtype = TY_mtype (rtype);
00258 RETURN_INFO info;
00259 INT32 i;
00260
00261
00262 info.return_via_first_arg = FALSE;
00263
00264 switch (mtype) {
00265
00266 case MTYPE_UNKNOWN:
00267
00268
00269 info.count = 0;
00270
00271
00272 break;
00273
00274 case MTYPE_V:
00275
00276 info.count = 0;
00277 break;
00278
00279 case MTYPE_I1:
00280 case MTYPE_I2:
00281 case MTYPE_I4:
00282 case MTYPE_U1:
00283 case MTYPE_U2:
00284 case MTYPE_U4:
00285 case MTYPE_A4:
00286 case MTYPE_F4:
00287
00288 info.count = 1;
00289 info.mtype [0] = mtype;
00290 info.preg [0] = PR_first_reg(SIM_INFO.int_results);
00291 break;
00292
00293 case MTYPE_I8:
00294 case MTYPE_U8:
00295 case MTYPE_A8:
00296
00297 case MTYPE_F8:
00298 info.count = 1;
00299 info.mtype [0] = mtype;
00300 info.preg [0] = PR_first_reg(SIM_INFO.int_results);
00301
00302
00303
00304 break;
00305
00306 case MTYPE_FQ:
00307 FmtAssert(FALSE, ("Unsupported type"));
00308 if (level == No_Simulated) {
00309
00310 info.count = 2;
00311 info.mtype [0] = MTYPE_F8;
00312 info.mtype [1] = MTYPE_F8;
00313 info.preg [0] = PR_first_reg(SIM_INFO.flt_results);
00314 info.preg [1] = PR_first_reg(SIM_INFO.flt_results)
00315 + PR_skip_value(SIM_INFO.flt_results);
00316 }
00317
00318 else {
00319
00320 info.count = 1;
00321 info.mtype [0] = mtype;
00322 info.preg [0] = PR_first_reg(SIM_INFO.flt_results);
00323 }
00324 break;
00325
00326 case MTYPE_C4:
00327 case MTYPE_C8:
00328
00329 FmtAssert(FALSE, ("Unsupported type"));
00330 if (level == Use_Simulated) {
00331
00332 info.count = 1;
00333 info.mtype [0] = mtype;
00334 info.preg [0] = PR_first_reg(SIM_INFO.flt_results);
00335 }
00336
00337 else {
00338
00339 info.count = 2;
00340 info.mtype [0] = Mtype_complex_to_real(mtype);
00341 info.mtype [1] = Mtype_complex_to_real(mtype);
00342 info.preg [0] = PR_first_reg(SIM_INFO.flt_results);
00343 info.preg [1] = PR_first_reg(SIM_INFO.flt_results)
00344 + PR_skip_value(SIM_INFO.flt_results);
00345 }
00346 break;
00347
00348 case MTYPE_CQ:
00349
00350 FmtAssert(FALSE, ("Unsupported type"));
00351 info.count = 4;
00352 for (INT32 i = 0; i < 4; i++) {
00353
00354 info.mtype [i] = Mtype_complex_to_real(mtype);
00355 info.preg [i] = PR_first_reg(SIM_INFO.flt_results)
00356 + i * PR_skip_value(SIM_INFO.flt_results);
00357 }
00358 break;
00359
00360 case MTYPE_M:
00361
00362 info.count = 0;
00363 info.return_via_first_arg = TRUE;
00364
00365 if (SIM_INFO.max_struct_result != 0) {
00366
00367 UINT64 size = TY_size(Ty_Table[rtype]);
00368
00369 if (size > 0 && 8 * size <= SIM_INFO.max_struct_result) {
00370
00371 int n = (size + MTYPE_RegisterSize(SIM_INFO.int_type) - 1)
00372 / MTYPE_RegisterSize(SIM_INFO.int_type);
00373 PREG_NUM reg = PR_first_reg(SIM_INFO.int_results);
00374
00375 if (n <= MAX_NUMBER_OF_REGISTERS_FOR_RETURN) {
00376 info.return_via_first_arg = FALSE;
00377 info.count = n;
00378 for (int i = 0; i < n; i++) {
00379 info.mtype [i] = SIM_INFO.int_type;
00380 info.preg [i] = reg++;
00381 }
00382 }
00383 }
00384 }
00385 break;
00386
00387 default:
00388
00389 info.count = 0;
00390 Fail_FmtAssertion ("Invalid return mtype %s encountered",
00391 (MTYPE_name(mtype)));
00392 break;
00393 }
00394
00395 for (i = info.count; i < MAX_NUMBER_OF_REGISTERS_FOR_RETURN; i++) {
00396
00397 info.mtype [i] = MTYPE_V;
00398 info.preg [i] = 0;
00399 }
00400
00401 return info;
00402 }
00403
00404 static BOOL First_Param_In_Return_Reg = FALSE;
00405
00406 static PLOC
00407 Setup_Parameter_Locations (TY_IDX pu_type)
00408 {
00409 static PLOC plocNULL;
00410
00411 TY_IDX ret_type = (TY_kind(pu_type) == KIND_FUNCTION ? TY_ret_type(pu_type)
00412 : pu_type);
00413 RETURN_INFO info = Get_Return_Info (ret_type, No_Simulated);
00414 First_Param_In_Return_Reg = (RETURN_INFO_return_via_first_arg(info)
00415 & SIM_return_addr_via_int_return_reg);
00416 if (TY_is_varargs (pu_type)) {
00417
00418 TYLIST_IDX idx = TY_tylist (pu_type);
00419 Last_Fixed_Param = -1;
00420 for (++idx; Tylist_Table[idx] != 0; ++idx)
00421 ++Last_Fixed_Param;
00422
00423 if ( ! TY_has_prototype(pu_type))
00424 --Last_Fixed_Param;
00425
00426 if (TY_return_to_param (pu_type))
00427 ++Last_Fixed_Param;
00428 } else
00429 Last_Fixed_Param = INT_MAX;
00430
00431 Current_Param_Num = -1;
00432 Last_Param_Offset = 0;
00433 return plocNULL;
00434 }
00435
00436
00437
00438 static inline PREG_NUM
00439 Get_Current_Float_Preg_Num (Preg_Range pr)
00440 {
00441 PREG_NUM i;
00442 TRACE_ENTRY("Get_Current_Float_Preg_Num");
00443 i = PR_first_reg(pr) + (Current_Param_Num * PR_skip_value(pr));
00444 if (i > PR_last_reg(pr)) {
00445 TRACE_EXIT_i("Get_Current_Float_Preg_Num", 0);
00446 return 0;
00447 }
00448 else {
00449 i = PR_first_reg(pr) + (Current_Param_Num * PR_skip_value(pr));
00450 TRACE_EXIT_i("Get_Current_Float_Preg_Num", i);
00451 return i;
00452 }
00453 }
00454
00455
00456 static PLOC
00457 Get_Parameter_Location (TY_IDX ty, BOOL is_output)
00458 {
00459 PLOC ploc;
00460
00461 ploc.reg = 0;
00462 ploc.start_offset = Last_Param_Offset;
00463 ploc.size = 0;
00464 ploc.vararg_reg = 0;
00465 if (TY_kind (ty) == KIND_VOID) {
00466 return ploc;
00467 }
00468
00469
00470 TYPE_ID pmtype = Fix_TY_mtype (ty);
00471 ploc.size = MTYPE_RegisterSize(pmtype);
00472
00473 if (First_Param_In_Return_Reg) {
00474 First_Param_In_Return_Reg = FALSE;
00475 ploc.reg = PR_first_reg(SIM_INFO.int_results);
00476 return ploc;
00477 }
00478 ++Current_Param_Num;
00479 if (TY_align_exp (ty) == 4 && (Current_Param_Num % 2) == 1) {
00480
00481 ++Current_Param_Num;
00482
00483 if (Last_Fixed_Param < INT_MAX)
00484 ++Last_Fixed_Param;
00485 ploc.start_offset += MTYPE_RegisterSize(SIM_INFO.flt_type);
00486 }
00487
00488 INT rpad = 0;
00489
00490 switch (pmtype) {
00491
00492 case MTYPE_I1:
00493 case MTYPE_U1:
00494 case MTYPE_I2:
00495 case MTYPE_U2:
00496 case MTYPE_I4:
00497 case MTYPE_U4:
00498 case MTYPE_A4:
00499 case MTYPE_F4:
00500 if (Target_Byte_Sex == BIG_ENDIAN) {
00501
00502 ploc.start_offset += (MTYPE_RegisterSize(SIM_INFO.int_type) -
00503 ploc.size);
00504 }
00505 else {
00506
00507 rpad = (MTYPE_RegisterSize(SIM_INFO.int_type) - ploc.size);
00508 }
00509 ploc.reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00510 break;
00511
00512 case MTYPE_I8:
00513 case MTYPE_U8:
00514 case MTYPE_A8:
00515 case MTYPE_F8:
00516 ploc.reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00517
00518
00519
00520 if (ploc.reg & 0x1 == 1) {
00521 ploc.start_offset += 4;
00522 Current_Param_Num++;
00523 if (Last_Fixed_Param < INT_MAX)
00524 ++Last_Fixed_Param;
00525 ploc.reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00526 }
00527
00528
00529
00530
00531 if (ploc.reg == 0) {
00532 ploc.start_offset = ((ploc.start_offset+4) >> 3) << 3;
00533 }
00534
00535 Current_Param_Num++;
00536
00537 if (Last_Fixed_Param < INT_MAX)
00538 ++Last_Fixed_Param;
00539 break;
00540
00541 case MTYPE_FQ:
00542
00543 FmtAssert(FALSE, ("Unsupported type"));
00544 if (Current_Param_Num > Last_Fixed_Param && !SIM_varargs_floats) {
00545
00546 ploc.reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00547 } else {
00548 ploc.reg = Get_Current_Float_Preg_Num (SIM_INFO.flt_args);
00549 ploc.vararg_reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00550 }
00551 Current_Param_Num++;
00552
00553 if (Last_Fixed_Param < INT_MAX)
00554 ++Last_Fixed_Param;
00555 break;
00556
00557 case MTYPE_C4:
00558 case MTYPE_C8:
00559 case MTYPE_CQ:
00560
00561 FmtAssert(FALSE, ("Unsupported type"));
00562 ploc.reg = Get_Current_Float_Preg_Num (SIM_INFO.flt_args);
00563 Current_Param_Num++;
00564
00565 if (Last_Fixed_Param < INT_MAX)
00566 ++Last_Fixed_Param;
00567 break;
00568
00569 case MTYPE_M:
00570 {
00571 ploc.size = TY_size (ty);
00572 INT psize = TY_size (ty) / MTYPE_RegisterSize(SIM_INFO.int_type);
00573
00574 if ((TY_size (ty) % MTYPE_RegisterSize(SIM_INFO.int_type)) != 0)
00575 psize++;
00576
00577 rpad = (psize * MTYPE_RegisterSize(SIM_INFO.int_type)) - ploc.size;
00578 RETURN_INFO info = Get_Return_Info (ty, No_Simulated);
00579 if (RETURN_INFO_count(info) &&
00580 MTYPE_float (RETURN_INFO_mtype (info, 0)) &&
00581 !(Current_Param_Num > Last_Fixed_Param && !SIM_varargs_floats)) {
00582 ploc.reg = Get_Current_Float_Preg_Num (SIM_INFO.flt_args);
00583 ploc.vararg_reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00584 Current_Param_Num += RETURN_INFO_count (info) - 1;
00585
00586 if (Last_Fixed_Param < INT_MAX)
00587 Last_Fixed_Param += RETURN_INFO_count(info) - 1;
00588 } else {
00589 ploc.reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00590 if (TY_fld(ty).Entry() && (MTYPE_byte_size(TY_mtype(FLD_type(TY_fld(ty))))==8)) {
00591 if (ploc.reg & 0x1 == 1) {
00592 ploc.start_offset += 4;
00593 Current_Param_Num++;
00594 if (Last_Fixed_Param < INT_MAX)
00595 ++Last_Fixed_Param;
00596 ploc.reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00597 }
00598
00599
00600
00601
00602 if (ploc.reg == 0) {
00603 ploc.start_offset = ((ploc.start_offset+4) >> 3) << 3;
00604 }
00605 }
00606
00607 Current_Param_Num += psize - 1;
00608
00609 if (Last_Fixed_Param < INT_MAX)
00610 Last_Fixed_Param += psize - 1;
00611 }
00612 }
00613 break;
00614
00615 default:
00616 FmtAssert (FALSE, ("Get_Parameter_Location: mtype %s",
00617 MTYPE_name(pmtype)));
00618 }
00619 Last_Param_Offset = ploc.start_offset + ploc.size + rpad;
00620 return ploc;
00621 }
00622
00623
00624
00625 struct PSTRUCT {
00626 BOOL is_struct;
00627 BOOL first_call;
00628 BOOL is_hfa;
00629 TYPE_ID hfa_mtype;
00630 INT64 offset;
00631 INT64 size;
00632
00633 PSTRUCT () : is_struct (FALSE), first_call (TRUE),
00634 is_hfa (FALSE), hfa_mtype (MTYPE_V),
00635 offset (0), size (0) {}
00636 };
00637
00638 static PSTRUCT pstruct;
00639
00640 #define PSTRUCT_struct pstruct.is_struct
00641 #define PSTRUCT_first_call pstruct.first_call
00642 #define PSTRUCT_hfa pstruct.is_hfa
00643 #define PSTRUCT_hfa_mtype pstruct.hfa_mtype
00644 #define PSTRUCT_offset pstruct.offset
00645 #define PSTRUCT_size pstruct.size
00646
00647 static void
00648 Setup_Struct_Parameter_Locations (TY_IDX struct_ty)
00649 {
00650 PSTRUCT_struct = ! TY_is_union (struct_ty);
00651 PSTRUCT_first_call = TRUE;
00652 PSTRUCT_hfa = FALSE;
00653 PSTRUCT_offset = 0;
00654 PSTRUCT_size = TY_size (struct_ty);
00655 }
00656
00657 static PLOC
00658 Get_Struct_Parameter_Location (PLOC prev)
00659 {
00660 TYPE_ID pmtype;
00661 PLOC next;
00662 INT ireg_size = MTYPE_RegisterSize(SIM_INFO.int_type);
00663 BOOL onStack = (prev.reg == 0);
00664
00665 if (PSTRUCT_first_call)
00666 PLOC_offset(next) = PLOC_offset(prev);
00667 else
00668 PLOC_offset(next) = PLOC_offset(prev) + PLOC_size(prev);
00669
00670 if (PSTRUCT_offset >= PSTRUCT_size) {
00671 PLOC_size(next) = 0;
00672 return next;
00673 }
00674
00675 PLOC_size(next) = ireg_size;
00676 PSTRUCT_offset += ireg_size;
00677
00678 if (onStack) {
00679 PLOC_reg(next) = 0;
00680 PSTRUCT_first_call = FALSE;
00681 } else if (PSTRUCT_first_call) {
00682 PSTRUCT_first_call = FALSE;
00683 PLOC_reg(next) = PLOC_reg(prev);
00684 } else if (IS_INT_PREG(PLOC_reg(prev))) {
00685 PLOC_reg(next) = PLOC_reg(prev) + PR_skip_value(SIM_INFO.int_args);
00686 if (!IS_INT_PREG(PLOC_reg(next)))
00687 PLOC_reg(next) = 0;
00688 }
00689
00690 return next;
00691 }
00692
00693
00694
00695 static PLOC
00696 Get_Vararg_Parameter_Location (PLOC prev)
00697 {
00698 PLOC next;
00699 Current_Param_Num++;
00700 next.reg = Get_Current_Preg_Num (SIM_INFO.int_args);
00701
00702 if (next.reg > PR_last_reg(SIM_INFO.int_args))
00703 {
00704 next.reg = 0;
00705 next.size = 0;
00706 }
00707 else
00708 {
00709 next.size = MTYPE_RegisterSize(SIM_INFO.int_type);
00710 }
00711
00712 next.start_offset = Last_Param_Offset;
00713 Last_Param_Offset = next.start_offset + next.size;
00714 return next;
00715 }
00716
00717 BOOL Is_Caller_Save_GP;
00718
00719 #if defined(TARG_SL)
00720 INT Formal_Save_Area_Size = 32;
00721 #else
00722 INT Formal_Save_Area_Size = 64;
00723 #endif
00724 INT Stack_Offset_Adjustment = 0;
00725
00726 extern void
00727 Init_Targ_Sim (void)
00728 {
00729 Is_Caller_Save_GP = SIM_caller_save_gp;
00730 }
00731