Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / legion / src / host / sparcv9native_ua200x.c
CommitLineData
920dae64
AT
1/*
2* ========== Copyright Header Begin ==========================================
3*
4* OpenSPARC T2 Processor File: sparcv9native_ua200x.c
5* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
6* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
7*
8* The above named program is free software; you can redistribute it and/or
9* modify it under the terms of the GNU General Public
10* License version 2 as published by the Free Software Foundation.
11*
12* The above named program is distributed in the hope that it will be
13* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15* General Public License for more details.
16*
17* You should have received a copy of the GNU General Public
18* License along with this work; if not, write to the Free Software
19* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
20*
21* ========== Copyright Header End ============================================
22*/
23/*
24 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
26 */
27
28#pragma ident "@(#)sparcv9native_ua200x.c 1.1 06/12/07 SMI"
29
30#include <stdio.h>
31#include <stdlib.h>
32#include <unistd.h>
33#include <string.h> /* memcpy/memset */
34#include <strings.h>
35#include <thread.h>
36#include "ss_common.h"
37#include "rock.h"
38#include "fpsim.h"
39
40static void fp_trap_gen (simcpu_t *sp, int trap_code);
41
42#define IMPL( _n ) void decoded_impl_rock_##_n (simcpu_t *sp, xicache_instn_t * xcip) {
43#define ENDI NEXT_INSTN(sp); ENDDEF
44#define ENDDEF }
45
46
47/* negated and half add fp ops */
48IMPL( rk_fnadds )
49 FP_EXEC_FPU_ON_CHECK;
50 int except, trap_code;
51 uint32_t result;
52 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
53 uint64_t fsrcopy = v9_get_fsr(sp);
54 uint64_t gsrcopy = sp->v9_gsr;
55
56 except = (*fpsimp->fnadds) ((float*) &F32src1, (float*) &F32src2, \
57 (float*) &result, fsrcopy, gsrcopy);
58DBGFP( lprintf(sp->gid, "fnadds; Fsrc1=0x%lx, Fsrc2=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, fsrcopy, gsrcopy, result); );
59 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
60 v9_set_fsr_fp_op(sp, fsrcopy);
61
62 if ( trap_code != 0 ) {
63 fp_trap_gen(sp, trap_code);
64 return;
65 }
66 F32dest = result;
67 ENDI
68
69IMPL( rk_fnaddd )
70 FP_EXEC_FPU_ON_CHECK;
71 int except, trap_code;
72 uint64_t result;
73 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
74 uint64_t fsrcopy = v9_get_fsr(sp);
75 uint64_t gsrcopy = sp->v9_gsr;
76
77 except = (*fpsimp->fnaddd) ((double*) &F64src1, (double*) &F64src2, \
78 (double*) &result, fsrcopy, gsrcopy);
79DBGFP( lprintf(sp->gid, "fnaddd; Fsrc1=0x%llx, Fsrc2=0x%llx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, fsrcopy, gsrcopy, result); );
80 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
81 v9_set_fsr_fp_op(sp, fsrcopy);
82
83 if ( trap_code != 0 ) {
84 fp_trap_gen(sp, trap_code);
85 return;
86 }
87 F64dest = result;
88 ENDI
89
90IMPL( rk_fnmuls )
91 FP_EXEC_FPU_ON_CHECK;
92 int except, trap_code;
93 uint32_t result;
94 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
95 uint64_t fsrcopy = v9_get_fsr(sp);
96 uint64_t gsrcopy = sp->v9_gsr;
97
98 except = (*fpsimp->fnmuls) ((float*) &F32src1, (float*) &F32src2, \
99 (float*) &result, fsrcopy, gsrcopy);
100DBGFP( lprintf(sp->gid, "fnmuls; Fsrc1=0x%lx, Fsrc2=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, fsrcopy, gsrcopy, result); );
101 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
102 v9_set_fsr_fp_op(sp, fsrcopy);
103
104 if ( trap_code != 0 ) {
105 fp_trap_gen(sp, trap_code);
106 return;
107 }
108 F32dest = result;
109 ENDI
110
111IMPL( rk_fnmuld )
112 FP_EXEC_FPU_ON_CHECK;
113 int except, trap_code;
114 uint64_t result;
115 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
116 uint64_t fsrcopy = v9_get_fsr(sp);
117 uint64_t gsrcopy = sp->v9_gsr;
118
119 except = (*fpsimp->fnmuld) ((double*) &F64src1, (double*) &F64src2, \
120 (double*) &result, fsrcopy, gsrcopy);
121DBGFP( lprintf(sp->gid, "fnmuld; Fsrc1=0x%llx, Fsrc2=0x%llx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, fsrcopy, gsrcopy, result); );
122 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
123 v9_set_fsr_fp_op(sp, fsrcopy);
124
125 if ( trap_code != 0 ) {
126 fp_trap_gen(sp, trap_code);
127 return;
128 }
129 F64dest = result;
130 ENDI
131
132IMPL( rk_fhadds )
133 FP_EXEC_FPU_ON_CHECK;
134 int except, trap_code;
135 uint32_t result;
136 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
137 uint64_t fsrcopy = v9_get_fsr(sp);
138 uint64_t gsrcopy = sp->v9_gsr;
139
140 except = (*fpsimp->fhadds) ((float*) &F32src1, (float*) &F32src2, \
141 (float*) &result, fsrcopy, gsrcopy, FHA_ADD);
142DBGFP( lprintf(sp->gid, "fhadds; Fsrc1=0x%lx, Fsrc2=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, fsrcopy, gsrcopy, result); );
143 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
144 v9_set_fsr_fp_op(sp, fsrcopy);
145
146 if ( trap_code != 0 ) {
147 fp_trap_gen(sp, trap_code);
148 return;
149 }
150 F32dest = result;
151 ENDI
152
153IMPL( rk_fhaddd )
154 FP_EXEC_FPU_ON_CHECK;
155 int except, trap_code;
156 uint64_t result;
157 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
158 uint64_t fsrcopy = v9_get_fsr(sp);
159 uint64_t gsrcopy = sp->v9_gsr;
160
161 except = (*fpsimp->fhaddd) ((double*) &F64src1, (double*) &F64src2, \
162 (double*) &result, fsrcopy, gsrcopy, FHA_ADD);
163DBGFP( lprintf(sp->gid, "fhaddd; Fsrc1=0x%llx, Fsrc2=0x%llx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, fsrcopy, gsrcopy, result); );
164 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
165 v9_set_fsr_fp_op(sp, fsrcopy);
166
167 if ( trap_code != 0 ) {
168 fp_trap_gen(sp, trap_code);
169 return;
170 }
171 F64dest = result;
172 ENDI
173
174IMPL( rk_fhsubs )
175 FP_EXEC_FPU_ON_CHECK;
176 int except, trap_code;
177 uint32_t result;
178 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
179 uint64_t fsrcopy = v9_get_fsr(sp);
180 uint64_t gsrcopy = sp->v9_gsr;
181
182 except = (*fpsimp->fhadds) ((float*) &F32src1, (float*) &F32src2, \
183 (float*) &result, fsrcopy, gsrcopy, FHA_SUB);
184DBGFP( lprintf(sp->gid, "fhsubs; Fsrc1=0x%lx, Fsrc2=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, fsrcopy, gsrcopy, result); );
185 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
186 v9_set_fsr_fp_op(sp, fsrcopy);
187
188 if ( trap_code != 0 ) {
189 fp_trap_gen(sp, trap_code);
190 return;
191 }
192 F32dest = result;
193 ENDI
194
195IMPL( rk_fhsubd )
196 FP_EXEC_FPU_ON_CHECK;
197 int except, trap_code;
198 uint64_t result;
199 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
200 uint64_t fsrcopy = v9_get_fsr(sp);
201 uint64_t gsrcopy = sp->v9_gsr;
202
203 except = (*fpsimp->fhaddd) ((double*) &F64src1, (double*) &F64src2, \
204 (double*) &result, fsrcopy, gsrcopy, FHA_SUB);
205DBGFP( lprintf(sp->gid, "fhsubd; Fsrc1=0x%llx, Fsrc2=0x%llx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, fsrcopy, gsrcopy, result); );
206 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
207 v9_set_fsr_fp_op(sp, fsrcopy);
208
209 if ( trap_code != 0 ) {
210 fp_trap_gen(sp, trap_code);
211 return;
212 }
213 F64dest = result;
214 ENDI
215
216IMPL( rk_fnhadds )
217 FP_EXEC_FPU_ON_CHECK;
218 int except, trap_code;
219 uint32_t result;
220 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
221 uint64_t fsrcopy = v9_get_fsr(sp);
222 uint64_t gsrcopy = sp->v9_gsr;
223
224 except = (*fpsimp->fhadds) ((float*) &F32src1, (float*) &F32src2, \
225 (float*) &result, fsrcopy, gsrcopy, FHA_ADD_NEG);
226DBGFP( lprintf(sp->gid, "fnhadds; Fsrc1=0x%lx, Fsrc2=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, fsrcopy, gsrcopy, result); );
227 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
228 v9_set_fsr_fp_op(sp, fsrcopy);
229
230 if ( trap_code != 0 ) {
231 fp_trap_gen(sp, trap_code);
232 return;
233 }
234 F32dest = result;
235 ENDI
236
237IMPL( rk_fnhaddd )
238 FP_EXEC_FPU_ON_CHECK;
239 int except, trap_code;
240 uint64_t result;
241 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
242 uint64_t fsrcopy = v9_get_fsr(sp);
243 uint64_t gsrcopy = sp->v9_gsr;
244
245 except = (*fpsimp->fhaddd) ((double*) &F64src1, (double*) &F64src2, \
246 (double*) &result, fsrcopy, gsrcopy, FHA_ADD_NEG);
247DBGFP( lprintf(sp->gid, "fnhaddd; Fsrc1=0x%llx, Fsrc2=0x%llx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, fsrcopy, gsrcopy, result); );
248 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
249 v9_set_fsr_fp_op(sp, fsrcopy);
250
251 if ( trap_code != 0 ) {
252 fp_trap_gen(sp, trap_code);
253 return;
254 }
255 F64dest = result;
256 ENDI
257
258IMPL( rk_fnsmuld )
259 FP_EXEC_FPU_ON_CHECK;
260 int except, trap_code;
261 uint64_t result;
262 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
263 uint64_t fsrcopy = v9_get_fsr(sp);
264 uint64_t gsrcopy = sp->v9_gsr;
265
266 except = (*fpsimp->fnsmuld) ((float*) &F32src1, (float*) &F32src2, \
267 (double*) &result, fsrcopy, gsrcopy);
268DBGFP( lprintf(sp->gid, "fnsmuld; Fsrc1=0x%llx, Fsrc2=0x%llx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F32src1, F32src2, fsrcopy, gsrcopy, result); );
269 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
270 v9_set_fsr_fp_op(sp, fsrcopy);
271
272 if ( trap_code != 0 ) {
273 fp_trap_gen(sp, trap_code);
274 return;
275 }
276 F64dest = result;
277 ENDI
278
279/* fused multiply add fp ops */
280IMPL( rk_fmadds )
281 FP_EXEC_FPU_ON_CHECK;
282 int except, trap_code;
283 uint32_t result;
284 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
285 uint64_t fsrcopy = v9_get_fsr(sp);
286 uint64_t gsrcopy = sp->v9_gsr;
287
288 except = (*fpsimp->fmadds) ((float*) &F32src1, (float*) &F32src2, (float*) &F32src3, \
289 (float*) &result, fsrcopy, gsrcopy, FMA_ADD_POS);
290DBGFP( lprintf(sp->gid, "fmadds; Fsrc1=0x%lx, Fsrc2=0x%lx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, F32src3, fsrcopy, gsrcopy, result); );
291 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
292 v9_set_fsr_fp_op(sp, fsrcopy);
293
294 if ( trap_code != 0 ) {
295 fp_trap_gen(sp, trap_code);
296 return;
297 }
298 F32dest = result;
299 ENDI
300
301IMPL( rk_fmaddd )
302 FP_EXEC_FPU_ON_CHECK;
303 int except, trap_code;
304 uint64_t result;
305 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
306 uint64_t fsrcopy = v9_get_fsr(sp);
307 uint64_t gsrcopy = sp->v9_gsr;
308
309 except = (*fpsimp->fmaddd) ((double*) &F64src1, (double*) &F64src2, (double*) &F64src3, \
310 (double*) &result, fsrcopy, gsrcopy, FMA_ADD_POS);
311DBGFP( lprintf(sp->gid, "fmaddd; Fsrc1=0x%llx, Fsrc2=0x%llx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, F64src3, fsrcopy, gsrcopy, result); );
312 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
313 v9_set_fsr_fp_op(sp, fsrcopy);
314
315 if ( trap_code != 0 ) {
316 fp_trap_gen(sp, trap_code);
317 return;
318 }
319 F64dest = result;
320 ENDI
321
322IMPL( rk_fmsubs )
323 FP_EXEC_FPU_ON_CHECK;
324 int except, trap_code;
325 uint32_t result;
326 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
327 uint64_t fsrcopy = v9_get_fsr(sp);
328 uint64_t gsrcopy = sp->v9_gsr;
329
330 except = (*fpsimp->fmadds) ((float*) &F32src1, (float*) &F32src2, (float*) &F32src3, \
331 (float*) &result, fsrcopy, gsrcopy, FMA_SUB_POS);
332DBGFP( lprintf(sp->gid, "fmsubs; Fsrc1=0x%lx, Fsrc2=0x%lx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, F32src3, fsrcopy, gsrcopy, result); );
333 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
334 v9_set_fsr_fp_op(sp, fsrcopy);
335
336 if ( trap_code != 0 ) {
337 fp_trap_gen(sp, trap_code);
338 return;
339 }
340 F32dest = result;
341 ENDI
342
343IMPL( rk_fmsubd )
344 FP_EXEC_FPU_ON_CHECK;
345 int except, trap_code;
346 uint64_t result;
347 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
348 uint64_t fsrcopy = v9_get_fsr(sp);
349 uint64_t gsrcopy = sp->v9_gsr;
350
351 except = (*fpsimp->fmaddd) ((double*) &F64src1, (double*) &F64src2, (double*) &F64src3, \
352 (double*) &result, fsrcopy, gsrcopy, FMA_SUB_POS);
353DBGFP( lprintf(sp->gid, "fmsubd; Fsrc1=0x%llx, Fsrc2=0x%llx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, F64src3, fsrcopy, gsrcopy, result); );
354 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
355 v9_set_fsr_fp_op(sp, fsrcopy);
356
357 if ( trap_code != 0 ) {
358 fp_trap_gen(sp, trap_code);
359 return;
360 }
361 F64dest = result;
362 ENDI
363
364IMPL( rk_fnmsubs )
365 FP_EXEC_FPU_ON_CHECK;
366 int except, trap_code;
367 uint32_t result;
368 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
369 uint64_t fsrcopy = v9_get_fsr(sp);
370 uint64_t gsrcopy = sp->v9_gsr;
371
372 except = (*fpsimp->fmadds) ((float*) &F32src1, (float*) &F32src2, (float*) &F32src3, \
373 (float*) &result, fsrcopy, gsrcopy, FMA_SUB_NEG);
374DBGFP( lprintf(sp->gid, "fnmsubs; Fsrc1=0x%lx, Fsrc2=0x%lx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, F32src3, fsrcopy, gsrcopy, result); );
375 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
376 v9_set_fsr_fp_op(sp, fsrcopy);
377
378 if ( trap_code != 0 ) {
379 fp_trap_gen(sp, trap_code);
380 return;
381 }
382 F32dest = result;
383 ENDI
384
385IMPL( rk_fnmsubd )
386 FP_EXEC_FPU_ON_CHECK;
387 int except, trap_code;
388 uint64_t result;
389 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
390 uint64_t fsrcopy = v9_get_fsr(sp);
391 uint64_t gsrcopy = sp->v9_gsr;
392
393 except = (*fpsimp->fmaddd) ((double*) &F64src1, (double*) &F64src2, (double*) &F64src3, \
394 (double*) &result, fsrcopy, gsrcopy, FMA_SUB_NEG);
395DBGFP( lprintf(sp->gid, "fnmsubd; Fsrc1=0x%llx, Fsrc2=0x%llx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, F64src3, fsrcopy, gsrcopy, result); );
396 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
397 v9_set_fsr_fp_op(sp, fsrcopy);
398
399 if ( trap_code != 0 ) {
400 fp_trap_gen(sp, trap_code);
401 return;
402 }
403 F64dest = result;
404 ENDI
405
406IMPL( rk_fnmadds )
407 FP_EXEC_FPU_ON_CHECK;
408 int except, trap_code;
409 uint32_t result;
410 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
411 uint64_t fsrcopy = v9_get_fsr(sp);
412 uint64_t gsrcopy = sp->v9_gsr;
413
414 except = (*fpsimp->fmadds) ((float*) &F32src1, (float*) &F32src2, (float*) &F32src3, \
415 (float*) &result, fsrcopy, gsrcopy, FMA_ADD_NEG);
416DBGFP( lprintf(sp->gid, "fnmadds; Fsrc1=0x%lx, Fsrc2=0x%lx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, F32src3, fsrcopy, gsrcopy, result); );
417 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
418 v9_set_fsr_fp_op(sp, fsrcopy);
419
420 if ( trap_code != 0 ) {
421 fp_trap_gen(sp, trap_code);
422 return;
423 }
424 F32dest = result;
425 ENDI
426
427IMPL( rk_fnmaddd )
428 FP_EXEC_FPU_ON_CHECK;
429 int except, trap_code;
430 uint64_t result;
431 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
432 uint64_t fsrcopy = v9_get_fsr(sp);
433 uint64_t gsrcopy = sp->v9_gsr;
434
435 except = (*fpsimp->fmaddd) ((double*) &F64src1, (double*) &F64src2, (double*) &F64src3, \
436 (double*) &result, fsrcopy, gsrcopy, FMA_ADD_NEG);
437DBGFP( lprintf(sp->gid, "fnmaddd; Fsrc1=0x%llx, Fsrc2=0x%llx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, F64src3, fsrcopy, gsrcopy, result); );
438 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
439 v9_set_fsr_fp_op(sp, fsrcopy);
440
441 if ( trap_code != 0 ) {
442 fp_trap_gen(sp, trap_code);
443 return;
444 }
445 F64dest = result;
446 ENDI
447
448/* unfused multiply add fp ops */
449IMPL( rk_fumadds )
450 FP_EXEC_FPU_ON_CHECK;
451 int except, trap_code;
452 uint32_t result;
453 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
454 uint64_t fsrcopy = v9_get_fsr(sp);
455 uint64_t gsrcopy = sp->v9_gsr;
456
457 except = (*fpsimp->fumadds) ((float*) &F32src1, (float*) &F32src2, (float*) &F32src3, \
458 (float*) &result, fsrcopy, gsrcopy, FMA_ADD_POS);
459DBGFP( lprintf(sp->gid, "fumadds; Fsrc1=0x%lx, Fsrc2=0x%lx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, F32src3, fsrcopy, gsrcopy, result); );
460 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
461 v9_set_fsr_fp_op(sp, fsrcopy);
462
463 if ( trap_code != 0 ) {
464 fp_trap_gen(sp, trap_code);
465 return;
466 }
467 F32dest = result;
468 ENDI
469
470IMPL( rk_fumaddd )
471 FP_EXEC_FPU_ON_CHECK;
472 int except, trap_code;
473 uint64_t result;
474 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
475 uint64_t fsrcopy = v9_get_fsr(sp);
476 uint64_t gsrcopy = sp->v9_gsr;
477
478 except = (*fpsimp->fumaddd) ((double*) &F64src1, (double*) &F64src2, (double*) &F64src3, \
479 (double*) &result, fsrcopy, gsrcopy, FMA_ADD_POS);
480DBGFP( lprintf(sp->gid, "fumaddd; Fsrc1=0x%llx, Fsrc2=0x%llx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, F64src3, fsrcopy, gsrcopy, result); );
481 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
482 v9_set_fsr_fp_op(sp, fsrcopy);
483
484 if ( trap_code != 0 ) {
485 fp_trap_gen(sp, trap_code);
486 return;
487 }
488 F64dest = result;
489 ENDI
490
491IMPL( rk_fumsubs )
492 FP_EXEC_FPU_ON_CHECK;
493 int except, trap_code;
494 uint32_t result;
495 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
496 uint64_t fsrcopy = v9_get_fsr(sp);
497 uint64_t gsrcopy = sp->v9_gsr;
498
499 except = (*fpsimp->fumadds) ((float*) &F32src1, (float*) &F32src2, (float*) &F32src3, \
500 (float*) &result, fsrcopy, gsrcopy, FMA_SUB_POS);
501DBGFP( lprintf(sp->gid, "fumsubs; Fsrc1=0x%lx, Fsrc2=0x%lx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, F32src3, fsrcopy, gsrcopy, result); );
502 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
503 v9_set_fsr_fp_op(sp, fsrcopy);
504
505 if ( trap_code != 0 ) {
506 fp_trap_gen(sp, trap_code);
507 return;
508 }
509 F32dest = result;
510 ENDI
511
512IMPL( rk_fumsubd )
513 FP_EXEC_FPU_ON_CHECK;
514 int except, trap_code;
515 uint64_t result;
516 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
517 uint64_t fsrcopy = v9_get_fsr(sp);
518 uint64_t gsrcopy = sp->v9_gsr;
519
520 except = (*fpsimp->fumaddd) ((double*) &F64src1, (double*) &F64src2, (double*) &F64src3, \
521 (double*) &result, fsrcopy, gsrcopy, FMA_SUB_POS);
522DBGFP( lprintf(sp->gid, "fumsubd; Fsrc1=0x%llx, Fsrc3=0x%llx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, F64src3, fsrcopy, gsrcopy, result); );
523 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
524 v9_set_fsr_fp_op(sp, fsrcopy);
525
526 if ( trap_code != 0 ) {
527 fp_trap_gen(sp, trap_code);
528 return;
529 }
530 F64dest = result;
531 ENDI
532
533IMPL( rk_fnumsubs )
534 FP_EXEC_FPU_ON_CHECK;
535 int except, trap_code;
536 uint32_t result;
537 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
538 uint64_t fsrcopy = v9_get_fsr(sp);
539 uint64_t gsrcopy = sp->v9_gsr;
540
541 except = (*fpsimp->fumadds) ((float*) &F32src1, (float*) &F32src2, (float*) &F32src3, \
542 (float*) &result, fsrcopy, gsrcopy, FMA_SUB_NEG);
543DBGFP( lprintf(sp->gid, "fnumsubs; Fsrc1=0x%lx, Fsrc2=0x%lx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, F32src3, fsrcopy, gsrcopy, result); );
544 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
545 v9_set_fsr_fp_op(sp, fsrcopy);
546
547 if ( trap_code != 0 ) {
548 fp_trap_gen(sp, trap_code);
549 return;
550 }
551 F32dest = result;
552 ENDI
553
554IMPL( rk_fnumsubd )
555 FP_EXEC_FPU_ON_CHECK;
556 int except, trap_code;
557 uint64_t result;
558 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
559 uint64_t fsrcopy = v9_get_fsr(sp);
560 uint64_t gsrcopy = sp->v9_gsr;
561
562 except = (*fpsimp->fumaddd) ((double*) &F64src1, (double*) &F64src2, (double*) &F64src3, \
563 (double*) &result, fsrcopy, gsrcopy, FMA_SUB_NEG);
564DBGFP( lprintf(sp->gid, "fnumsubd; Fsrc1=0x%llx, Fsrc2=0x%llx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, F64src3, fsrcopy, gsrcopy, result); );
565 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
566 v9_set_fsr_fp_op(sp, fsrcopy);
567
568 if ( trap_code != 0 ) {
569 fp_trap_gen(sp, trap_code);
570 return;
571 }
572 F64dest = result;
573 ENDI
574
575IMPL( rk_fnumadds )
576 FP_EXEC_FPU_ON_CHECK;
577 int except, trap_code;
578 uint32_t result;
579 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
580 uint64_t fsrcopy = v9_get_fsr(sp);
581 uint64_t gsrcopy = sp->v9_gsr;
582
583 except = (*fpsimp->fumadds) ((float*) &F32src1, (float*) &F32src2, (float*) &F32src3, \
584 (float*) &result, fsrcopy, gsrcopy, FMA_ADD_NEG);
585DBGFP( lprintf(sp->gid, "fnumadds; Fsrc1=0x%lx, Fsrc3=0x%lx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%lx\n", F32src1, F32src2, F32src3, fsrcopy, gsrcopy, result); );
586 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
587 v9_set_fsr_fp_op(sp, fsrcopy);
588
589 if ( trap_code != 0 ) {
590 fp_trap_gen(sp, trap_code);
591 return;
592 }
593 F32dest = result;
594 ENDI
595
596IMPL( rk_fnumaddd )
597 FP_EXEC_FPU_ON_CHECK;
598 int except, trap_code;
599 uint64_t result;
600 struct fpsim_functions *fpsimp = sp->config_procp->proc_typep->fpsimp;
601 uint64_t fsrcopy = v9_get_fsr(sp);
602 uint64_t gsrcopy = sp->v9_gsr;
603
604 except = (*fpsimp->fumaddd) ((double*) &F64src1, (double*) &F64src2, (double*) &F64src3, \
605 (double*) &result, fsrcopy, gsrcopy, FMA_ADD_NEG);
606DBGFP( lprintf(sp->gid, "fnumaddd; Fsrc1=0x%llx, Fsrc2=0x%llx, Fsrc3=0x%lx, FSR=0x%llx, GSR=0x%llx, result=0x%llx\n", F64src1, F64src2, F64src3, fsrcopy, gsrcopy, result); );
607 trap_code = (*fpsimp->update_fsr) (except, (void*)&fsrcopy);
608 v9_set_fsr_fp_op(sp, fsrcopy);
609
610 if ( trap_code != 0 ) {
611 fp_trap_gen(sp, trap_code);
612 return;
613 }
614 F64dest = result;
615 ENDI
616
617static void fp_trap_gen (simcpu_t *sp, int trap_code) {
618 sparcv9_cpu_t * v9p = (sparcv9_cpu_t*)(sp->specificp);
619 switch (trap_code) {
620 case 0x21:
621 v9p->post_precise_trap(sp, Sparcv9_trap_fp_exception_ieee_754);
622 return;
623 case 0x22:
624 v9p->post_precise_trap(sp, Sparcv9_trap_fp_exception_other);
625 return;
626 case 0x10:
627 v9p->post_precise_trap(sp, Sparcv9_trap_illegal_instruction);
628 return;
629 default:
630 fatal ("unknown fp lib trap_code");
631 return;
632 }
633}