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 #ifndef irbdata_INCLUDED
00039 #define irbdata_INCLUDED
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #ifndef symtab_INCLUDED
00052 #include "symtab.h"
00053 #endif
00054
00055 #ifndef irbdata_defs_INCLUDED
00056 #include "irbdata_defs.h"
00057 #endif
00058
00059
00060
00061 inline ST_IDX
00062 INITO_st_idx (const INITO& inito) { return inito.st_idx; }
00063 inline void
00064 Set_INITO_st_idx (INITO& inito, ST_IDX st) { inito.st_idx = st; }
00065 inline void
00066 Set_INITO_st_idx (INITO_IDX idx, ST_IDX st)
00067 { Set_INITO_st_idx(Inito_Table[idx], st); }
00068 inline ST*
00069 INITO_st (const INITO& ino) { return &St_Table[ino.st_idx]; }
00070 inline ST*
00071 INITO_st (const INITO* ino) { return &St_Table[ino->st_idx]; }
00072 inline ST*
00073 INITO_st (const INITO_IDX idx) { return &St_Table[Inito_Table[idx].st_idx]; }
00074
00075 inline INITV_IDX
00076 INITO_val (const INITO& inito) { return inito.val; }
00077 inline INITV_IDX
00078 INITO_val (INITO_IDX idx) { return INITO_val (Inito_Table[idx]);}
00079 inline void
00080 Set_INITO_val (INITO& ino, INITV_IDX inv) { ino.val = inv; }
00081 inline void
00082 Set_INITO_val (INITO_IDX idx, INITV_IDX inv)
00083 { Set_INITO_val(Inito_Table[idx], inv); }
00084
00085
00086
00087
00088
00089
00090 inline INITV_IDX
00091 INITV_next (const INITV& initv) { return initv.next; }
00092 inline INITV_IDX
00093 INITV_next (const INITV_IDX idx) { return Initv_Table[idx].next; }
00094
00095 inline void
00096 Set_INITV_next(const INITV_IDX idx, const INITV_IDX nidx)
00097 {
00098 Initv_Table[idx].next = nidx;
00099 }
00100
00101
00102 inline void
00103 INITV_read_check (BOOL condition)
00104 {
00105 Is_True (condition, ("INITV read access error"));
00106 }
00107
00108 inline INITVKIND
00109 INITV_kind (const INITV& initv) { return initv.kind; }
00110 inline INITVKIND
00111 INITV_kind (const INITV_IDX idx) { return Initv_Table[idx].kind; }
00112
00113 inline UINT16
00114 INITV_repeat1 (const INITV& initv) {
00115 #ifdef Is_True_On
00116 switch (initv.kind) {
00117 case INITVKIND_ZERO:
00118 case INITVKIND_ONE:
00119 case INITVKIND_VAL:
00120 INITV_read_check (FALSE);
00121 break;
00122 default:
00123 break;
00124 }
00125 #endif
00126
00127 return initv.repeat1;
00128 }
00129
00130 inline UINT32
00131 INITV_repeat2 (const INITV& initv) {
00132 #ifdef Is_True_On
00133 switch (initv.kind) {
00134 case INITVKIND_ZERO:
00135 case INITVKIND_ONE:
00136 case INITVKIND_VAL:
00137 break;
00138 default:
00139 INITV_read_check (FALSE);
00140 break;
00141 }
00142 #endif
00143
00144 return initv.Repeat2 ();
00145 }
00146
00147 inline UINT32
00148 INITV_repeat (const INITV_IDX inv)
00149 {
00150 switch (Initv_Table[inv].kind) {
00151 case INITVKIND_VAL:
00152 case INITVKIND_ZERO:
00153 case INITVKIND_ONE:
00154 return Initv_Table[inv].u.tcval.repeat2;
00155 default:
00156 return Initv_Table[inv].repeat1;
00157 }
00158 }
00159
00160 inline ST_IDX
00161 INITV_st (const INITV& initv) {
00162 INITV_read_check (initv.kind == INITVKIND_SYMOFF);
00163 return initv.St ();
00164 }
00165 inline ST_IDX
00166 INITV_st (const INITV_IDX initv) {
00167 INITV_read_check (Initv_Table[initv].kind == INITVKIND_SYMOFF);
00168 return Initv_Table[initv].St ();
00169 }
00170 inline void
00171 Set_INITV_st (INITV_IDX inv, ST_IDX st)
00172 {
00173 INITV_read_check (Initv_Table[inv].kind == INITVKIND_SYMOFF);
00174 Initv_Table[inv].u.sto.st = st;
00175 }
00176
00177 inline INT32
00178 INITV_ofst (const INITV& initv) {
00179 INITV_read_check (initv.kind == INITVKIND_SYMOFF);
00180 return initv.Ofst ();
00181 }
00182 inline INT32
00183 INITV_ofst (const INITV_IDX initv) {
00184 INITV_read_check (Initv_Table[initv].kind == INITVKIND_SYMOFF);
00185 return Initv_Table[initv].Ofst ();
00186 }
00187 inline void
00188 Set_INITV_ofst (INITV_IDX inv, INT32 ofst)
00189 {
00190 INITV_read_check (Initv_Table[inv].kind == INITVKIND_SYMOFF);
00191 Initv_Table[inv].u.sto.ofst = ofst;
00192 }
00193
00194 inline LABEL_IDX
00195 INITV_lab (const INITV& initv) {
00196 INITV_read_check (initv.kind == INITVKIND_LABEL);
00197 return initv.Lab ();
00198 }
00199 inline LABEL_IDX
00200 INITV_lab (const INITV_IDX initv) {
00201 return INITV_lab (Initv_Table[initv]);
00202 }
00203 inline void
00204 Set_INITV_lab (INITV& inv, LABEL_IDX lab) {
00205 inv.u.lab.lab = lab;
00206 inv.u.lab.unused = 0;
00207 }
00208 inline void
00209 Set_INITV_lab (INITV_IDX inv, LABEL_IDX lab) {
00210 INITV_read_check (Initv_Table[inv].kind == INITVKIND_LABEL);
00211 Set_INITV_lab(Initv_Table[inv], lab);
00212 }
00213
00214 inline LABEL_IDX
00215 INITV_lab1 (const INITV& initv) {
00216 INITV_read_check (initv.kind == INITVKIND_SYMDIFF ||
00217 initv.kind == INITVKIND_SYMDIFF16);
00218 return initv.Lab1 ();
00219 }
00220 inline LABEL_IDX
00221 INITV_lab1 (const INITV_IDX initv) {
00222 return INITV_lab1 (Initv_Table[initv]);
00223 }
00224 inline void
00225 Set_INITV_lab1 (INITV& inv, LABEL_IDX lab1) {
00226 inv.u.stdiff.lab1 = lab1;
00227 }
00228 inline void
00229 Set_INITV_lab1 (INITV_IDX inv, LABEL_IDX lab1) {
00230 INITV_read_check (Initv_Table[inv].kind == INITVKIND_SYMDIFF ||
00231 Initv_Table[inv].kind == INITVKIND_SYMDIFF16);
00232 Set_INITV_lab1(Initv_Table[inv], lab1);
00233 }
00234
00235 inline ST_IDX
00236 INITV_st2 (const INITV& initv) {
00237 INITV_read_check (initv.kind == INITVKIND_SYMDIFF ||
00238 initv.kind == INITVKIND_SYMDIFF16);
00239 return initv.St2 ();
00240 }
00241 inline ST_IDX
00242 INITV_st2 (const INITV_IDX initv) {
00243 return INITV_st2 (Initv_Table[initv]);
00244 }
00245 inline void
00246 Set_INITV_st2 (INITV_IDX inv, ST_IDX st2) {
00247 INITV_read_check (Initv_Table[inv].kind == INITVKIND_SYMDIFF ||
00248 Initv_Table[inv].kind == INITVKIND_SYMDIFF16);
00249 Initv_Table[inv].u.stdiff.st2 = st2;
00250 }
00251
00252 inline TCON_IDX
00253 INITV_tc (const INITV& initv) {
00254 INITV_read_check (initv.kind == INITVKIND_VAL);
00255 return initv.Tc ();
00256 }
00257 inline TCON&
00258 INITV_tc_val (const INITV& initv) {
00259 INITV_read_check (initv.kind == INITVKIND_VAL);
00260 return Tcon_Table[initv.Tc ()];
00261 }
00262 inline TCON&
00263 INITV_tc_val (const INITV_IDX initv) {
00264 INITV_read_check (Initv_Table[initv].kind == INITVKIND_VAL);
00265 return Tcon_Table[Initv_Table[initv].Tc ()];
00266 }
00267
00268 inline TYPE_ID
00269 INITV_mtype (const INITV& initv) {
00270 INITV_read_check (initv.kind == INITVKIND_ZERO ||
00271 initv.kind == INITVKIND_ONE);
00272 return initv.Mtype ();
00273 }
00274 inline TYPE_ID
00275 INITV_mtype (const INITV_IDX initv) {
00276 INITV_read_check (Initv_Table[initv].kind == INITVKIND_ZERO ||
00277 Initv_Table[initv].kind == INITVKIND_ONE);
00278 return Initv_Table[initv].Mtype ();
00279 }
00280
00281 inline INITV_IDX
00282 INITV_blk (const INITV& initv) {
00283 INITV_read_check (initv.kind == INITVKIND_BLOCK);
00284 return initv.Blk ();
00285 }
00286 inline INITV_IDX
00287 INITV_blk (const INITV_IDX initv) {
00288 return INITV_blk(Initv_Table[initv]);
00289 }
00290 inline void
00291 Set_INITV_blk (INITV& inv, INITV_IDX blk) {
00292 inv.u.blk.blk = blk;
00293 inv.u.blk.unused = 0;
00294 }
00295 inline void
00296 Set_INITV_blk (INITV_IDX inv, INITV_IDX blk) {
00297 Set_INITV_blk(Initv_Table[inv], blk);
00298 }
00299
00300 inline INT32
00301 INITV_pad (const INITV& initv) {
00302 INITV_read_check (initv.kind == INITVKIND_PAD);
00303 return initv.Pad ();
00304 }
00305 inline INT32
00306 INITV_pad (const INITV_IDX initv) {
00307 INITV_read_check (Initv_Table[initv].kind == INITVKIND_PAD);
00308 return Initv_Table[initv].Pad ();
00309 }
00310 inline void
00311 Set_INITV_pad (INITV& initv, UINT32 pad_bytes) {
00312 initv.u.pad.pad = pad_bytes;
00313 }
00314
00315
00316
00317
00318 extern INITO_IDX
00319 New_INITO (ST_IDX st, INITV_IDX val = 0);
00320 inline INITO_IDX
00321 New_INITO (const ST *st, INITV_IDX val = 0) {
00322 return New_INITO (ST_st_idx (st), val);
00323 }
00324
00325 extern INITV_IDX New_INITV (void);
00326
00327 extern INITV_IDX
00328 Copy_INITV (INITV_IDX parent_inv, INITO_IDX ino, INITV_IDX inv);
00329
00330 extern void
00331 INITV_Init_Integer (INITV_IDX inv,
00332 TYPE_ID mtype, INT64 val, UINT16 repeat = 1);
00333
00334 extern void
00335 INITV_Init_Float (INITV_IDX inv, TYPE_ID mtype, double val, UINT16 repeat = 1);
00336
00337 extern void
00338 INITV_Init_String (INITV_IDX inv, char *str, INT size, UINT16 repeat = 1);
00339
00340 extern void
00341 INITV_Init_Symoff (INITV_IDX inv, ST *st, INT64 ofst, UINT16 repeat = 1);
00342
00343 extern void
00344 INITV_Init_Label (INITV_IDX inv, LABEL_IDX lab, UINT16 repeat = 1);
00345
00346 extern void
00347 INITV_Init_Symdiff (INITV_IDX inv,
00348 LABEL_IDX lab1, ST *st2, BOOL halfword, UINT16 repeat = 1);
00349
00350 extern void
00351 INITV_Init_Block (INITV_IDX inv, INITV_IDX bval, UINT16 repeat = 1);
00352
00353 extern void
00354 INITV_Init_Pad (INITV_IDX inv, UINT32 pad_bytes);
00355
00356
00357 inline INITV_IDX
00358 Append_INITV (INITV_IDX inv, INITO_IDX ino, INITV_IDX prev_inv)
00359 {
00360 if (prev_inv == INITV_IDX_ZERO)
00361 Set_INITO_val (ino, inv);
00362 else
00363 Set_INITV_next (prev_inv, inv);
00364 return inv;
00365 }
00366
00367
00368 inline INITV_IDX
00369 INITV_Next_Idx(void) { return Initv_Table.Size(); }
00370
00371
00372 extern UINT
00373 Get_INITO_Size (INITO_IDX ino);
00374
00375 extern INITO_IDX
00376 Find_INITO_For_Symbol (const ST *st);
00377
00378 const char *
00379 InitvKind_Name (INITVKIND knd);
00380
00381 INITVKIND
00382 Name_To_InitvKind (const char* nm);
00383
00384
00385 extern void
00386 Print_INITV (const INITV& initv);
00387
00388 extern void
00389 Print_INITVs (INITV_IDX initv);
00390
00391 extern void
00392 Print_INITO (const INITO& ino);
00393 inline void
00394 Print_INITO (INITO_IDX idx) { Print_INITO(Inito_Table[idx]); }
00395
00396 extern void
00397 Print_Inits (UINT level);
00398
00399
00400
00401
00402 inline void
00403 INITV_Set_SYMOFF (INITV& initv, mUINT16 rp1, ST_IDX st, INT32 ofst) {
00404 initv.next = 0;
00405 initv.kind = INITVKIND_SYMOFF;
00406 initv.repeat1 = rp1;
00407 initv.u.sto.st = st;
00408 initv.u.sto.ofst = ofst;
00409 }
00410
00411 inline void
00412 INITV_Set_LABEL (INITV& initv, mUINT16 rp1, LABEL_IDX lab) {
00413 initv.next = 0;
00414 initv.kind = INITVKIND_LABEL;
00415 initv.repeat1 = rp1;
00416 initv.u.lab.lab = lab;
00417 initv.u.lab.unused = 0;
00418 }
00419
00420 inline void
00421 INITV_Set_int (INITV& initv, INITVKIND kind, TYPE_ID m, UINT32 rp2) {
00422 initv.next = 0;
00423 initv.kind = kind;
00424 initv.repeat1 = 0;
00425 initv.u.tcval.u.mtype = m;
00426 initv.u.tcval.repeat2 = rp2;
00427 }
00428 inline void
00429 INITV_Set_ZERO (INITV& initv, TYPE_ID m, UINT32 rp2) {
00430 INITV_Set_int (initv, INITVKIND_ZERO, m, rp2);
00431 }
00432 inline void
00433 INITV_Set_ONE (INITV& initv, TYPE_ID m, UINT32 rp2) {
00434 INITV_Set_int (initv, INITVKIND_ONE, m, rp2);
00435 }
00436
00437 inline void
00438 INITV_Set_VAL (INITV& initv, TCON_IDX t, mUINT32 rp2) {
00439 initv.next = 0;
00440 initv.kind = INITVKIND_VAL;
00441 initv.repeat1 = 0;
00442 initv.u.tcval.u.tc = t;
00443 initv.u.tcval.repeat2 = rp2;
00444 }
00445
00446 inline void
00447 INITV_Set_BLOCK (INITV& initv, mUINT16 rp1, INITV_IDX b) {
00448 initv.next = 0;
00449 initv.kind = INITVKIND_BLOCK;
00450 initv.repeat1 = rp1;
00451 initv.u.blk.blk = b;
00452 initv.u.blk.unused = 0;
00453 }
00454
00455 inline void
00456 INITV_Set_PAD (INITV& initv, UINT32 pad_bytes) {
00457 initv.next = 0;
00458 initv.kind = INITVKIND_PAD;
00459 initv.repeat1 = 1;
00460 initv.u.pad.pad = pad_bytes;
00461 initv.u.pad.unused = 0;
00462 }
00463
00464 inline void
00465 INITV_Set_SYMDIFF (INITV& initv, mUINT16 rp1, LABEL_IDX s1, ST_IDX s2,
00466 BOOL halfword)
00467 {
00468 initv.next = 0;
00469 initv.kind = halfword ? INITVKIND_SYMDIFF16 : INITVKIND_SYMDIFF;
00470 initv.repeat1 = rp1;
00471 initv.u.stdiff.lab1 = s1;
00472 initv.u.stdiff.st2 = s2;
00473 }
00474
00475
00476
00477
00478
00479 extern INITV_IDX
00480 Irb_Init_Symoff (INITO_IDX ino, INITV_IDX inv, mUINT16 repeat, ST *st,
00481 INT64 ofst);
00482
00483 extern INITV_IDX
00484 Irb_Init_Label (INITO_IDX ino, INITV_IDX inv, mUINT16 repeat, LABEL_IDX lab);
00485
00486 extern INITV_IDX
00487 Irb_Init_Symdiff (INITO_IDX ino, INITV_IDX inv, mUINT16 repeat, LABEL_IDX lab1,
00488 ST *st2, BOOL halfword);
00489
00490 extern INITV_IDX
00491 Irb_Init_Val (INITO_IDX ino, INITV_IDX inv, UINT32 repeat, TCON_IDX tc);
00492
00493 extern INITV_IDX
00494 Irb_Init_Pad (INITO_IDX ino, INITV_IDX inv, UINT32 pad_bytes);
00495
00496 extern INITV_IDX
00497 Irb_Init_Block (INITO_IDX ino, INITV_IDX inv, mUINT16 repeat);
00498
00499 extern INITV_IDX
00500 Irb_Init_Integer (INT size, INT64 value, INT32 repeat, INITO_IDX ino,
00501 INITV_IDX inv);
00502
00503 extern INITV_IDX
00504 Irb_Init_Integer_Of_Type (TYPE_ID mtype, INT64 value, INT32 repeat,
00505 INITO_IDX ino, INITV_IDX inv);
00506
00507 extern INITV_IDX
00508 Irb_Init_String (INT size, char *str, INT32 repeat, INITO_IDX ino,
00509 INITV_IDX inv);
00510
00511 #ifndef MONGOOSE_BE
00512
00513 extern INITV_IDX
00514 Irb_Init_Float (INT size, double value, INT32 repeat, INITO_IDX ino,
00515 INITV_IDX inv);
00516
00517 extern INITV_IDX
00518 Irb_Init_Float_4 (INT size, float value, INT32 repeat, INITO_IDX ino,
00519 INITV_IDX inv);
00520
00521 extern INITV_IDX
00522 Irb_Init_Quad (INT size, QUAD_TYPE value, INT32 repeat, INITO_IDX ino,
00523 INITV_IDX inv);
00524
00525 extern INITV_IDX
00526 Irb_Init_Complex (INT size, double real, double imag, INT32 repeat,
00527 INITO_IDX ino, INITV_IDX inv);
00528
00529 extern INITV_IDX
00530 Irb_Init_Complex_4 (INT size, float real, float imag, INT32 repeat,
00531 INITO_IDX ino, INITV_IDX inv);
00532
00533 extern INITV_IDX
00534 Irb_Init_Complex_Quad (INT size, QUAD_TYPE real, QUAD_TYPE imag,
00535 INT32 repeat, INITO_IDX ino, INITV_IDX inv);
00536
00537 #endif
00538
00539 #endif