00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef SSB_RS_LINK_H
00013 #define SSB_RS_LINK_H
00014
00015
00016
00017
00018
00019 #include "ssb_host.h"
00020 #include "ssb_machine.h"
00021 #include "ssb_ruu.h"
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 struct RS_link {
00037 RS_link *next;
00038 struct RUU_station *rs;
00039 INST_TAG_TYPE tag;
00040 union {
00041 tick_t when;
00042 INST_SEQ_TYPE seq;
00043 int opnum;
00044 } x;
00045 };
00046
00047 class RS_link_list {
00048 RS_link* head;
00049 public:
00050 RS_link_list(int nlinks);
00051 RS_link *RSLINK_NEW( struct RUU_station *rs )
00052 { struct RS_link *n_link;
00053 if (!head) panic("out of rs links");
00054 n_link = head;
00055 head = head->next;
00056 n_link->next = NULL;
00057 n_link->rs = rs;
00058 n_link->tag = n_link->rs->tag;
00059 return n_link;
00060 };
00061 void RSLINK_FREE( RS_link *link)
00062 { RS_link *f_link = link;
00063 f_link->rs = NULL;
00064 f_link->tag = 0;
00065 f_link->next = head;
00066 head = f_link;
00067 };
00068 void RSLINK_FREE_LIST( RS_link *link)
00069 { RS_link *fl_link, *fl_link_next;
00070 for (fl_link=link; fl_link; fl_link=fl_link_next)
00071 {
00072 fl_link_next = fl_link->next;
00073 RSLINK_FREE(fl_link);
00074 }
00075 };
00076 RS_link RSLINK_NULL;
00077 };
00078
00079
00080 #define RSLINK_INIT(RSL, RS) \
00081 ((RSL).next = NULL, (RSL).rs = (RS), (RSL).tag = (RS)->tag)
00082
00083 #if 0
00084
00085 #define RSLINK_IS_NULL(LINK) ((LINK)->rs == NULL)
00086 #endif
00087
00088
00089 #define RSLINK_VALID(LINK) ((LINK)->tag == (LINK)->rs->tag)
00090
00091
00092 #define RSLINK_RS(LINK) ((LINK)->rs)
00093
00094 #if 0
00095
00096 #define RSLINK_NEW(DST, RS) \
00097 { struct RS_link *n_link; \
00098 if (!RS_link::rslink_free_list) \
00099 panic("out of rs links"); \
00100 n_link = RS_link::rslink_free_list; \
00101 RS_link::rslink_free_list = RS_link::rslink_free_list->next; \
00102 n_link->next = NULL; \
00103 n_link->rs = (RS); n_link->tag = n_link->rs->tag; \
00104 (DST) = n_link; \
00105 }
00106
00107
00108 #define RSLINK_FREE(LINK) \
00109 { RS_link *f_link = (LINK); \
00110 f_link->rs = NULL; f_link->tag = 0; \
00111 f_link->next = RS_link::rslink_free_list; \
00112 RS_link::rslink_free_list = f_link; \
00113 }
00114
00115
00116
00117 #define RSLINK_FREE_LIST(LINK) \
00118 { RS_link *fl_link, *fl_link_next; \
00119 for (fl_link=(LINK); fl_link; fl_link=fl_link_next) \
00120 { \
00121 fl_link_next = fl_link->next; \
00122 RSLINK_FREE(fl_link); \
00123 } \
00124 }
00125 #endif
00126
00127
00128 #endif