Go to the documentation of this file.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 #ifndef targ_sim_core_INCLUDED
00037 #define targ_sim_core_INCLUDED
00038 #ifdef __cplusplus
00039 extern "C" {
00040 #endif
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #define Preg_Offset_Is_Int(n) \
00052 ((n) >= Int_Preg_Min_Offset && (n) <= Int_Preg_Max_Offset)
00053 #define Preg_Offset_Is_Float(n) \
00054 ((n) >= Float_Preg_Min_Offset && (n) <= Float_Preg_Max_Offset)
00055 #define Preg_Offset_Is_Fcc(n) \
00056 ((n) >= Fcc_Preg_Min_Offset && (n) <= Fcc_Preg_Max_Offset)
00057 #define Preg_Is_Dedicated(n) (n <= Last_Dedicated_Preg_Offset)
00058
00059
00060 extern BOOL Is_Return_Preg (PREG_NUM preg);
00061
00062
00063 extern BOOL Is_Int_Output_Preg (PREG_NUM preg);
00064
00065
00066 extern BOOL Is_Formal_Preg (PREG_NUM preg);
00067
00068
00069
00070 typedef enum {
00071 Use_Simulated,
00072 Complex_Not_Simulated,
00073 No_Simulated
00074 } Mtype_Return_Level;
00075
00076 class RETURN_INFO {
00077 private:
00078 mINT8 count;
00079 BOOL return_via_first_arg;
00080 TYPE_ID mtype [MAX_NUMBER_OF_REGISTERS_FOR_RETURN];
00081 PREG_NUM preg [MAX_NUMBER_OF_REGISTERS_FOR_RETURN];
00082 public:
00083 friend inline mINT8 RETURN_INFO_count (const RETURN_INFO&);
00084 friend inline BOOL RETURN_INFO_return_via_first_arg (const RETURN_INFO&);
00085 friend inline TYPE_ID RETURN_INFO_mtype (const RETURN_INFO&, INT32);
00086 friend inline PREG_NUM RETURN_INFO_preg (const RETURN_INFO&, INT32);
00087 friend RETURN_INFO Get_Return_Info (TY_IDX rtype, Mtype_Return_Level level);
00088 };
00089
00090 inline mINT8
00091 RETURN_INFO_count (const RETURN_INFO& info) { return info.count; }
00092
00093 inline BOOL
00094 RETURN_INFO_return_via_first_arg (const RETURN_INFO& info)
00095 {
00096 return info.return_via_first_arg;
00097 }
00098
00099 inline TYPE_ID
00100 RETURN_INFO_mtype (const RETURN_INFO& info, INT32 i) { return info.mtype [i]; }
00101
00102 inline PREG_NUM
00103 RETURN_INFO_preg (const RETURN_INFO& info, INT32 i) { return info.preg [i]; }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 extern void Get_Return_Mtypes (
00114 TY_IDX rtype,
00115 Mtype_Return_Level level,
00116 TYPE_ID *mreg1,
00117 TYPE_ID *mreg2);
00118
00119
00120
00121
00122
00123
00124
00125 extern void Get_Return_Pregs (
00126 TYPE_ID mreg1,
00127 TYPE_ID mreg2,
00128 PREG_NUM *rreg1,
00129 PREG_NUM *rreg2);
00130
00131
00132
00133
00134
00135
00136
00137 typedef struct {
00138 PREG_NUM reg;
00139 INT32 start_offset;
00140 INT32 size;
00141 PREG_NUM vararg_reg;
00142 } PLOC;
00143
00144 #define PLOC_reg(p) (p.reg)
00145 #define PLOC_vararg_reg(p) (p.vararg_reg)
00146 #define PLOC_offset(p) (p.start_offset)
00147 #define PLOC_on_stack(p) (p.reg == 0)
00148 #define PLOC_total_size(p) (p.start_offset+p.size)
00149 #define PLOC_size(p) (p.size)
00150 #define PLOC_is_empty(p) (PLOC_size(p) == 0)
00151 #define PLOC_is_nonempty(p) (PLOC_size(p) != 0)
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 extern PLOC Setup_Input_Parameter_Locations (TY_IDX pu_type);
00173 extern PLOC Get_Input_Parameter_Location (TY_IDX ptype);
00174
00175 extern PLOC First_Input_PLOC_Reg (PLOC ploc, TY_IDX parm_ty);
00176 extern PLOC Next_Input_PLOC_Reg (PLOC prev);
00177
00178 extern PLOC Setup_Output_Parameter_Locations (TY_IDX pu_type);
00179 extern PLOC Get_Output_Parameter_Location (TY_IDX ptype);
00180
00181 extern PLOC First_Output_PLOC_Reg (PLOC ploc, TY_IDX parm_ty);
00182 extern PLOC Next_Output_PLOC_Reg (PLOC prev);
00183
00184
00185 extern PLOC Get_Vararg_Input_Parameter_Location (PLOC prev);
00186 extern PLOC Get_Vararg_Output_Parameter_Location (PLOC prev);
00187
00188
00189
00190 extern INT32 Get_Preg_Size (PREG_NUM p);
00191
00192
00193
00194
00195
00196
00197
00198
00199 extern void Setup_Struct_Input_Parameter_Locations (TY_IDX struct_ty);
00200 extern PLOC Get_Struct_Input_Parameter_Location ( PLOC prev );
00201 extern void Setup_Struct_Output_Parameter_Locations (TY_IDX struct_ty);
00202 extern PLOC Get_Struct_Output_Parameter_Location ( PLOC prev );
00203
00204
00205
00206
00207
00208 extern TYPE_ID Fix_TY_mtype(TY_IDX);
00209
00210
00211
00212
00213
00214
00215 extern BOOL Is_Caller_Save_GP;
00216
00217
00218 extern INT Formal_Save_Area_Size;
00219
00220
00221 extern INT Stack_Offset_Adjustment;
00222
00223 extern void Init_Targ_Sim (void);
00224
00225
00226
00227 inline PREG_IDX
00228 Get_Preg_Idx (PREG_NUM n) { return n - Last_Dedicated_Preg_Offset; }
00229 inline PREG_NUM
00230 Get_Preg_Num (PREG_IDX i) { return i + Last_Dedicated_Preg_Offset; }
00231
00232 #ifndef PUSH_RETURN_ADDRESS_ON_STACK
00233 #define PUSH_RETURN_ADDRESS_ON_STACK FALSE
00234 #endif
00235
00236 #ifndef PUSH_FRAME_POINTER_ON_STACK
00237 #define PUSH_FRAME_POINTER_ON_STACK FALSE
00238 #endif
00239
00240 #ifdef __cplusplus
00241 }
00242 #endif
00243 #endif
00244