Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | # ========== Copyright Header Begin ========================================== |
2 | # | |
3 | # OpenSPARC T2 Processor File: SS_InstrRun.py | |
4 | # Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. | |
5 | # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES. | |
6 | # | |
7 | # The above named program is free software; you can redistribute it and/or | |
8 | # modify it under the terms of the GNU General Public | |
9 | # License version 2 as published by the Free Software Foundation. | |
10 | # | |
11 | # The above named program is distributed in the hope that it will be | |
12 | # useful, but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | # General Public License for more details. | |
15 | # | |
16 | # You should have received a copy of the GNU General Public | |
17 | # License along with this work; if not, write to the Free Software | |
18 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. | |
19 | # | |
20 | # ========== Copyright Header End ============================================ | |
21 | ||
22 | from SS_Setup import * | |
23 | from SS_InstrSim import * | |
24 | from SS_InstrAlu import * | |
25 | from SS_InstrCtr import * | |
26 | from SS_InstrCti import * | |
27 | from SS_InstrLsu import * | |
28 | from SS_InstrFpu import * | |
29 | from SS_InstrVis import * | |
30 | ||
31 | setup = setups[sys.argv[1]] | |
32 | ||
33 | mem = [] | |
34 | exe = SS_InstrTable(setup, 'xx_xxxxxx') | |
35 | ||
36 | # 00_xxxxxx | |
37 | ||
38 | exe.append(SS_illtrap()) | |
39 | exe.append(ss_bp_icc) | |
40 | exe.append(ss_bp_c01) | |
41 | exe.append(ss_bp_xcc) | |
42 | exe.append(ss_bp_c11) | |
43 | exe.append(ss_bi) | |
44 | exe.append(ss_br) | |
45 | exe.append(SS_nop()) | |
46 | exe.append(SS_sethi()) | |
47 | exe.append(ss_fbp_fcc0) | |
48 | exe.append(ss_fbp_fcc1) | |
49 | exe.append(ss_fbp_fcc2) | |
50 | exe.append(ss_fbp_fcc3) | |
51 | exe.append(ss_fbi) | |
52 | for i in range(0,8): | |
53 | exe.append(SS_ill()) | |
54 | ||
55 | # 01_xxxxxx | |
56 | ||
57 | exe.append(SS_call()) | |
58 | ||
59 | # 10_000xxx add .... xnor, | |
60 | # 10_001xxx addc mulx umul smul subc udivx udiv sdiv | |
61 | # 10_010xxx addcc .... xnorcc, | |
62 | # 10_011xxx addccc - umulcc smulcc subccc - udivcc sdivcc | |
63 | # 10_100xxx taddcc tsubcc taddcctv tsubcctv mulscc sll srl sra | |
64 | # 10_101xxx rdasr rdhrf rdprf flushw movcc sdivx popc movr | |
65 | # 10_110xxx wrasr saved/restored wrprf wrhrf fpop1 fpop2 vis fmaf | |
66 | # 10_111xxx jmpl return tcc flush(a) save restore done/retry fmau | |
67 | ||
68 | for i in ['add','and','or','xor','sub','andn','orn','xnor']: | |
69 | exe.append(SS_alu(i)) | |
70 | for i in ['addc','mulx','umul','smul','subc','udivx','udiv','sdiv']: | |
71 | exe.append(SS_alu(i)) | |
72 | for i in ['addcc','andcc','orcc','xorcc','subcc','andncc','orncc','xnorcc']: | |
73 | exe.append(SS_alu(i)) | |
74 | for i in ['addccc','-','umulcc','smulcc','subccc','-','udivcc','sdivcc']: | |
75 | if i == '-': | |
76 | exe.append(SS_ill()) | |
77 | else: | |
78 | exe.append(SS_alu(i)) | |
79 | ||
80 | exe.append(SS_tagged_alu('taddcc')) | |
81 | exe.append(SS_tagged_alu('tsubcc')) | |
82 | exe.append(SS_tagged_alu('taddcctv')) | |
83 | exe.append(SS_tagged_alu('tsubcctv')) | |
84 | if setup.product == 'N2': | |
85 | exe.append(SS_alu('mulscc')) | |
86 | exe.append(ss_sll) | |
87 | exe.append(ss_srl) | |
88 | exe.append(ss_sra) | |
89 | ||
90 | exe.append(ss_rdasr) | |
91 | exe.append(ss_rdhrf) | |
92 | exe.append(ss_rdprf) | |
93 | exe.append(SS_flushw()) | |
94 | exe.append(ss_movcc) | |
95 | exe.append(SS_alu('sdivx')) | |
96 | exe.append(SS_popc()) | |
97 | exe.append(ss_movr) | |
98 | ||
99 | exe.append(ss_wrasr) | |
100 | exe.append(ss_saved) | |
101 | exe.append(ss_wrprf) | |
102 | exe.append(ss_wrhrf) | |
103 | exe.append(ss_fpop1) | |
104 | exe.append(ss_fpop2) | |
105 | exe.append(ss_vis) | |
106 | exe.append(ss_fmaf) | |
107 | ||
108 | exe.append(SS_jmpl()) | |
109 | exe.append(SS_return()) | |
110 | exe.append(ss_tcc) | |
111 | exe.append(ss_flush) | |
112 | exe.append(SS_save()) | |
113 | exe.append(SS_restore()) | |
114 | exe.append(ss_done) | |
115 | exe.append(ss_fmau) | |
116 | ||
117 | for i in ['lduw', 'ldub', 'lduh', 'ldd', 'stw', 'stb', 'sth', 'std', # 11_000xxx | |
118 | 'ldsw', 'ldsb', 'ldsh', 'ldx', '-', 'ldstub', 'stx', 'swap', # 11_001xxx | |
119 | 'lduwa','lduba', 'lduha','ldda', 'stwa','stba', 'stha', 'stda', # 11_010xxx | |
120 | 'ldswa','ldsba', 'ldsha','ldxa', '-', 'ldstuba', 'stxa', 'swapa', # 11_011xxx | |
121 | 'ldf', 'ldxfsr','-', 'lddf', 'stf', 'stxfsr', '-', 'stdf', # 11_100xxx | |
122 | '-', '-', '-', '-', '-', 'prefetch', '-', '-', # 11_101xxx | |
123 | 'ldfa', '-', '-', 'lddfa','stfa','-', '-', 'stdfa', # 11_110xxx | |
124 | '-', '-', '-', '-', 'casa','prefetcha','casxa','-' ]: # 11_111xxx | |
125 | if i == '-': | |
126 | exe.append(SS_ill()) | |
127 | elif i == 'ldxfsr': | |
128 | exe.append(ss_ldxfsr) | |
129 | elif i == 'stxfsr': | |
130 | exe.append(ss_stxfsr) | |
131 | elif i == 'prefetch': | |
132 | exe.append(ss_prefetch) | |
133 | elif i == 'prefetcha': | |
134 | exe.append(ss_prefetcha) | |
135 | else: | |
136 | exe.append(SS_lsu_dec(i)) | |
137 | ||
138 | ||
139 | for i in ['lduw','ldub','lduh','ldd','ldsw','ldsb','ldsh','ldx','ldtd', | |
140 | 'stw','stb','sth','std','stx','stfsr','stxfsr', | |
141 | 'ldf','lddf','ldshortf8','ldshortf16','ldblockf','ldfsr','ldxfsr', | |
142 | 'stf','stdf','stshortf8','stshortf16','stpartial8','stpartial16','stpartial32','stblockf', | |
143 | 'ldstub','swap','cas','casx','prefetch','flush']: | |
144 | exe.append(SS_lsu_exe(i)) | |
145 | ||
146 | exe.append(SS_rdasi('i0','rd')) | |
147 | exe.append(SS_rdasi('i0','g0')) | |
148 | exe.append(SS_rdasi('i1','rd')) | |
149 | exe.append(SS_rdasi('i1','g0')) | |
150 | exe.append(SS_wrasi('i0','rd')) | |
151 | exe.append(SS_wrasi('i0','g0')) | |
152 | exe.append(SS_wrasi('i1','rd')) | |
153 | exe.append(SS_wrasi('i1','g0')) | |
154 | ||
155 | for i in ['lduw','ldub','lduh','ldd','ldsw','ldsb','ldsh','ldx','ldtd']: | |
156 | mem.append(SS_ld_mem(i,'rd')) | |
157 | mem.append(SS_ld_mem(i,'g0')) | |
158 | for i in ['prefetch']: | |
159 | mem.append(SS_ld_mem(i,'fn')) | |
160 | for i in ['ldf','lddf','ldshortf8','ldshortf16','ldblockf','ldfsr','ldxfsr']: | |
161 | mem.append(SS_ld_mem(i,'fp')) | |
162 | for i in ['stw','stb','sth','std','stx']: | |
163 | mem.append(SS_st_mem(i,'rd')) | |
164 | mem.append(SS_st_mem(i,'g0')) | |
165 | for i in ['stf','stdf','stshortf8','stshortf16','stpartial8','stpartial16','stpartial32','stblockf','stfsr','stxfsr']: | |
166 | mem.append(SS_st_mem(i,'fp')) | |
167 | ||
168 | mem.append(SS_ldstub_mem('ldstub','rd')) | |
169 | mem.append(SS_ldstub_mem('ldstub','g0')) | |
170 | mem.append(SS_swap_mem('swap','rd')) | |
171 | mem.append(SS_swap_mem('swap','g0')) | |
172 | mem.append(SS_cas_mem('cas','rd')) | |
173 | mem.append(SS_cas_mem('cas','g0')) | |
174 | mem.append(SS_cas_mem('casx','rd')) | |
175 | mem.append(SS_cas_mem('casx','g0')) | |
176 | mem.append(SS_flush_mem('flush','fn')) | |
177 | ||
178 | ||
179 | ||
180 | if sys.argv[2] == 's': | |
181 | ||
182 | s_file=open('%sAsm.s' % sys.argv[3],'w') | |
183 | s_file.write('#if !defined(ARCH_X64)\n') | |
184 | s_file.write('#include "SS_Assembly.h"\n') | |
185 | s_file.write('\n') | |
186 | s_file.write('.section\t".text"\n') | |
187 | s_file.write('\n') | |
188 | s_file.write('.register\t%g2,#scratch\n') | |
189 | s_file.write('.register\t%g3,#scratch\n') | |
190 | s_file.write('\n') | |
191 | s_file.write('/* cas and casx are not sun sparc instructions so for now do*/\n') | |
192 | s_file.write('#define run_dec_cas run_dec_casa\n') | |
193 | s_file.write('#define run_dec_casx run_dec_casxa\n') | |
194 | s_file.write('\n') | |
195 | s_file.write('#if defined(ARCH_V9)\n') | |
196 | s_file.write('#define V8_PC\n') | |
197 | s_file.write('#elif defined(ARCH_V8)\n') | |
198 | s_file.write('#define V8_PC\\\n') | |
199 | s_file.write(' srl %o0,0,%o1;\\\n') | |
200 | s_file.write(' srlx %o0,32,%o0\n') | |
201 | s_file.write('#else\n') | |
202 | s_file.write('#error "Need ARCH option in make\n') | |
203 | s_file.write('#endif\n') | |
204 | s_file.write('\n') | |
205 | s_file.write('#include "SS_Float.s"\n') | |
206 | s_file.write('#include "SS_LsuTrap.s"\n') | |
207 | ||
208 | s_file.write('\n') | |
209 | for i in mem: | |
210 | i.idx_mem_s(s_file) | |
211 | ||
212 | s_file.write('\n') | |
213 | exe.exe_idx_s(s_file) | |
214 | ||
215 | exe.run_dec_s(s_file) | |
216 | exe.run_exe_s(s_file) | |
217 | ||
218 | s_file.write('#endif\n') | |
219 | s_file.close() | |
220 | ||
221 | elif sys.argv[2] == 'h': | |
222 | ||
223 | h_base_name = sys.argv[3].split('/')[-1] | |
224 | h_file=open('%sCpp.h' % sys.argv[3],'w') | |
225 | h_file.write('#ifndef __'+h_base_name+'Cpp_h__\n') | |
226 | h_file.write('#define __'+h_base_name+'Cpp_h__\n') | |
227 | h_file.write('\n') | |
228 | ||
229 | h_file.write('\n') | |
230 | h_file.write('extern SS_Memop mem_run_table[][4];\n') | |
231 | h_file.write('extern SS_Memop mem_trc_table[][4];\n') | |
232 | h_file.write('extern SS_Memop mem_ras_table[][4];\n') | |
233 | h_file.write('\n') | |
234 | h_file.write('extern SS_DecodeTable run_dec_xx_xxxxxx;\n') | |
235 | h_file.write('\n') | |
236 | ||
237 | h_file.write('\nenum ExeIdx\n') | |
238 | h_file.write('{\n') | |
239 | exe.gen_exe_tbl(h_file,mode='idx') | |
240 | h_file.write(' idx_exe_table_size\n') | |
241 | h_file.write('};\n\n') | |
242 | ||
243 | h_file.write('#endif\n') | |
244 | h_file.close() | |
245 | ||
246 | elif sys.argv[2] == 'cc': | |
247 | ||
248 | c_file=open('%sCpp.cc' % sys.argv[3],'w') | |
249 | c_file.write('#include "BL_Endian.h"\n') | |
250 | c_file.write('#include "SS_Strand.h"\n') | |
251 | c_file.write('#include "SS_Tlb.h"\n') | |
252 | c_file.write('#include "SS_Decode.h"\n') | |
253 | c_file.write('#include "SS_TrcExe.h"\n') | |
254 | c_file.write('#include "SS_V8Code.h"\n') | |
255 | ||
256 | if setup.product in ['N2']: | |
257 | c_file.write('#include "BL_Hamming_64_8_Synd.h"\n') | |
258 | c_file.write('#include "N2_Model.h"\n') | |
259 | c_file.write('#include "N2_RunCpp.h"\n') | |
260 | c_file.write('#include "N2_Strand.h"\n') | |
261 | c_file.write('#include "N2_MemErrDetector.h"\n') | |
262 | ||
263 | c_file.write('\nenum MemIdx\n') | |
264 | c_file.write('{\n') | |
265 | c_file.write(' idx_mem_xxxxx,\n') | |
266 | for i in mem: | |
267 | i.gen_mem_tbl(c_file,'idx') | |
268 | c_file.write(' mem_idx_table_size\n') | |
269 | c_file.write('};\n\n') | |
270 | ||
271 | c_file.write('static inline uint64_t endianess_partial( uint64_t b )\n') | |
272 | c_file.write('{\n') | |
273 | c_file.write(' uint64_t v = 0;\n') | |
274 | c_file.write(' for (int i=0; i<8; i++)\n') | |
275 | c_file.write(' {\n') | |
276 | c_file.write(' v = (v << 1) | (b & 1);\n') | |
277 | c_file.write(' b >>= 1;\n') | |
278 | c_file.write(' }\n') | |
279 | c_file.write(' return v;\n') | |
280 | c_file.write('}\n') | |
281 | c_file.write('\n') | |
282 | ||
283 | exe.run_exe_c(c_file) | |
284 | ||
285 | for i in mem: | |
286 | i.mem_c(c_file) | |
287 | ||
288 | c_file.write('\n') | |
289 | c_file.write('SS_Execute '+setup.product+'_Strand::run_exe_table[] =\n') | |
290 | c_file.write('{\n') | |
291 | exe.gen_exe_tbl(c_file,'run') | |
292 | c_file.write(' 0\n') | |
293 | c_file.write('};\n\n') | |
294 | ||
295 | c_file.write('#if !defined(ARCH_X64)\n') | |
296 | c_file.write('SS_Execute '+setup.product+'_Strand::v8_run_exe_table[] =\n') | |
297 | c_file.write('{\n') | |
298 | exe.gen_exe_tbl(c_file,'v8_run') | |
299 | c_file.write(' 0\n') | |
300 | c_file.write('};\n\n') | |
301 | c_file.write('#endif\n') | |
302 | ||
303 | c_file.write('SS_Execute '+setup.product+'_Strand::trc_exe_table[] =\n') | |
304 | c_file.write('{\n') | |
305 | exe.gen_exe_tbl(c_file,'trc') | |
306 | c_file.write(' 0\n') | |
307 | c_file.write('};\n\n') | |
308 | ||
309 | c_file.write('SS_Memop '+setup.product+'_Strand::mem_run_table[][4] =\n') | |
310 | c_file.write('{\n') | |
311 | c_file.write(' mem_run_fetch512,\n') | |
312 | c_file.write(' io_run_fetch512,\n') | |
313 | c_file.write(' 0,\n') | |
314 | c_file.write(' 0,\n') | |
315 | for i in mem: | |
316 | i.gen_mem_tbl(c_file,'run') | |
317 | c_file.write(' 0\n') | |
318 | c_file.write('};\n\n') | |
319 | ||
320 | c_file.write('SS_Memop '+setup.product+'_Strand::mem_trc_table[][4] =\n') | |
321 | c_file.write('{\n') | |
322 | c_file.write(' mem_trc_fetch512,\n') | |
323 | c_file.write(' io_trc_fetch512,\n') | |
324 | c_file.write(' 0,\n') | |
325 | c_file.write(' 0,\n') | |
326 | for i in mem: | |
327 | i.gen_mem_tbl(c_file,'trc') | |
328 | c_file.write(' 0\n') | |
329 | c_file.write('};\n\n') | |
330 | ||
331 | c_file.write('SS_Memop '+setup.product+'_Strand::mem_ras_table[][4] =\n') | |
332 | c_file.write('{\n') | |
333 | c_file.write(' mem_trc_fetch512,\n') | |
334 | c_file.write(' io_trc_fetch512,\n') | |
335 | c_file.write(' 0,\n') | |
336 | c_file.write(' 0,\n') | |
337 | for i in mem: | |
338 | i.gen_mem_tbl(c_file,'ras') | |
339 | c_file.write(' 0\n') | |
340 | c_file.write('};\n\n') | |
341 | ||
342 | exe.run_dec_c(c_file) | |
343 | ||
344 | c_file.close() |