1 /* Simulator header for cgen parallel support.
2 Copyright (C) 1999, 2000 Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions.
5 This file is part of the GNU instruction set simulator.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 /* Kinds of writes stored on the write queue. */
25 enum cgen_write_queue_kind
{
26 CGEN_BI_WRITE
, CGEN_QI_WRITE
, CGEN_SI_WRITE
, CGEN_SF_WRITE
,
28 CGEN_FN_HI_WRITE
, CGEN_FN_SI_WRITE
, CGEN_FN_SF_WRITE
,
29 CGEN_FN_DI_WRITE
, CGEN_FN_DF_WRITE
,
30 CGEN_FN_XI_WRITE
, CGEN_FN_PC_WRITE
,
31 CGEN_MEM_QI_WRITE
, CGEN_MEM_HI_WRITE
, CGEN_MEM_SI_WRITE
, CGEN_MEM_DI_WRITE
,
32 CGEN_MEM_DF_WRITE
, CGEN_MEM_XI_WRITE
,
33 CGEN_FN_MEM_QI_WRITE
, CGEN_FN_MEM_HI_WRITE
, CGEN_FN_MEM_SI_WRITE
,
34 CGEN_FN_MEM_DI_WRITE
, CGEN_FN_MEM_DF_WRITE
, CGEN_FN_MEM_XI_WRITE
,
38 /* Element of the write queue. */
40 enum cgen_write_queue_kind kind
; /* Used to select union member below. */
41 IADDR insn_address
; /* Address of the insn performing the write. */
65 void (*function
)(SIM_CPU
*, UINT
, UHI
);
70 void (*function
)(SIM_CPU
*, UINT
, USI
);
75 void (*function
)(SIM_CPU
*, UINT
, SF
);
80 void (*function
)(SIM_CPU
*, UINT
, DI
);
85 void (*function
)(SIM_CPU
*, UINT
, DF
);
90 void (*function
)(SIM_CPU
*, UINT
, SI
*);
94 void (*function
)(SIM_CPU
*, USI
);
123 void (*function
)(SIM_CPU
*, IADDR
, SI
, QI
);
128 void (*function
)(SIM_CPU
*, IADDR
, SI
, HI
);
133 void (*function
)(SIM_CPU
*, IADDR
, SI
, SI
);
138 void (*function
)(SIM_CPU
*, IADDR
, SI
, DI
);
143 void (*function
)(SIM_CPU
*, IADDR
, SI
, DF
);
148 void (*function
)(SIM_CPU
*, IADDR
, SI
, SI
*);
151 } CGEN_WRITE_QUEUE_ELEMENT
;
153 #define CGEN_WRITE_QUEUE_ELEMENT_KIND(element) ((element)->kind)
154 #define CGEN_WRITE_QUEUE_ELEMENT_IADDR(element) ((element)->insn_address)
156 extern void cgen_write_queue_element_execute (
157 SIM_CPU
*, CGEN_WRITE_QUEUE_ELEMENT
*
160 /* Instance of the queue for parallel write-after support. */
161 /* FIXME: Should be dynamic? */
162 #define CGEN_WRITE_QUEUE_SIZE (64 * 4) /* 64 writes x 4 insns -- for now. */
166 CGEN_WRITE_QUEUE_ELEMENT q
[CGEN_WRITE_QUEUE_SIZE
];
169 #define CGEN_WRITE_QUEUE_CLEAR(queue) ((queue)->index = 0)
170 #define CGEN_WRITE_QUEUE_INDEX(queue) ((queue)->index)
171 #define CGEN_WRITE_QUEUE_ELEMENT(queue, ix) (&(queue)->q[(ix)])
173 #define CGEN_WRITE_QUEUE_NEXT(queue) ( \
174 (queue)->index < CGEN_WRITE_QUEUE_SIZE \
175 ? &(queue)->q[(queue)->index++] \
176 : cgen_write_queue_overflow (queue) \
179 extern CGEN_WRITE_QUEUE_ELEMENT
*cgen_write_queue_overflow (CGEN_WRITE_QUEUE
*);
181 /* Functions for queuing writes. Used by semantic code. */
182 extern void sim_queue_bi_write (SIM_CPU
*, BI
*, BI
);
183 extern void sim_queue_qi_write (SIM_CPU
*, UQI
*, UQI
);
184 extern void sim_queue_si_write (SIM_CPU
*, SI
*, SI
);
185 extern void sim_queue_sf_write (SIM_CPU
*, SI
*, SF
);
187 extern void sim_queue_pc_write (SIM_CPU
*, USI
);
189 extern void sim_queue_fn_hi_write (SIM_CPU
*, void (*)(SIM_CPU
*, UINT
, UHI
), UINT
, UHI
);
190 extern void sim_queue_fn_si_write (SIM_CPU
*, void (*)(SIM_CPU
*, UINT
, USI
), UINT
, USI
);
191 extern void sim_queue_fn_sf_write (SIM_CPU
*, void (*)(SIM_CPU
*, UINT
, SF
), UINT
, SF
);
192 extern void sim_queue_fn_di_write (SIM_CPU
*, void (*)(SIM_CPU
*, UINT
, DI
), UINT
, DI
);
193 extern void sim_queue_fn_df_write (SIM_CPU
*, void (*)(SIM_CPU
*, UINT
, DF
), UINT
, DF
);
194 extern void sim_queue_fn_xi_write (SIM_CPU
*, void (*)(SIM_CPU
*, UINT
, SI
*), UINT
, SI
*);
195 extern void sim_queue_fn_pc_write (SIM_CPU
*, void (*)(SIM_CPU
*, USI
), USI
);
197 extern void sim_queue_mem_qi_write (SIM_CPU
*, SI
, QI
);
198 extern void sim_queue_mem_hi_write (SIM_CPU
*, SI
, HI
);
199 extern void sim_queue_mem_si_write (SIM_CPU
*, SI
, SI
);
200 extern void sim_queue_mem_di_write (SIM_CPU
*, SI
, DI
);
201 extern void sim_queue_mem_df_write (SIM_CPU
*, SI
, DF
);
202 extern void sim_queue_mem_xi_write (SIM_CPU
*, SI
, SI
*);
204 extern void sim_queue_fn_mem_qi_write (SIM_CPU
*, void (*)(SIM_CPU
*, IADDR
, SI
, QI
), SI
, QI
);
205 extern void sim_queue_fn_mem_hi_write (SIM_CPU
*, void (*)(SIM_CPU
*, IADDR
, SI
, HI
), SI
, HI
);
206 extern void sim_queue_fn_mem_si_write (SIM_CPU
*, void (*)(SIM_CPU
*, IADDR
, SI
, SI
), SI
, SI
);
207 extern void sim_queue_fn_mem_di_write (SIM_CPU
*, void (*)(SIM_CPU
*, IADDR
, SI
, DI
), SI
, DI
);
208 extern void sim_queue_fn_mem_df_write (SIM_CPU
*, void (*)(SIM_CPU
*, IADDR
, SI
, DF
), SI
, DF
);
209 extern void sim_queue_fn_mem_xi_write (SIM_CPU
*, void (*)(SIM_CPU
*, IADDR
, SI
, SI
*), SI
, SI
*);
211 #endif /* CGEN_PAR_H */