Revision 1a2fb1c0 target-sparc/op.c
b/target-sparc/op.c | ||
---|---|---|
19 | 19 |
*/ |
20 | 20 |
|
21 | 21 |
#include "exec.h" |
22 |
|
|
23 |
/*XXX*/ |
|
24 |
#define REGNAME g0 |
|
25 |
#define REG (env->gregs[0]) |
|
26 |
#include "op_template.h" |
|
27 |
#define REGNAME g1 |
|
28 |
#define REG (env->gregs[1]) |
|
29 |
#include "op_template.h" |
|
30 |
#define REGNAME g2 |
|
31 |
#define REG (env->gregs[2]) |
|
32 |
#include "op_template.h" |
|
33 |
#define REGNAME g3 |
|
34 |
#define REG (env->gregs[3]) |
|
35 |
#include "op_template.h" |
|
36 |
#define REGNAME g4 |
|
37 |
#define REG (env->gregs[4]) |
|
38 |
#include "op_template.h" |
|
39 |
#define REGNAME g5 |
|
40 |
#define REG (env->gregs[5]) |
|
41 |
#include "op_template.h" |
|
42 |
#define REGNAME g6 |
|
43 |
#define REG (env->gregs[6]) |
|
44 |
#include "op_template.h" |
|
45 |
#define REGNAME g7 |
|
46 |
#define REG (env->gregs[7]) |
|
47 |
#include "op_template.h" |
|
48 |
#define REGNAME i0 |
|
49 |
#define REG (REGWPTR[16]) |
|
50 |
#include "op_template.h" |
|
51 |
#define REGNAME i1 |
|
52 |
#define REG (REGWPTR[17]) |
|
53 |
#include "op_template.h" |
|
54 |
#define REGNAME i2 |
|
55 |
#define REG (REGWPTR[18]) |
|
56 |
#include "op_template.h" |
|
57 |
#define REGNAME i3 |
|
58 |
#define REG (REGWPTR[19]) |
|
59 |
#include "op_template.h" |
|
60 |
#define REGNAME i4 |
|
61 |
#define REG (REGWPTR[20]) |
|
62 |
#include "op_template.h" |
|
63 |
#define REGNAME i5 |
|
64 |
#define REG (REGWPTR[21]) |
|
65 |
#include "op_template.h" |
|
66 |
#define REGNAME i6 |
|
67 |
#define REG (REGWPTR[22]) |
|
68 |
#include "op_template.h" |
|
69 |
#define REGNAME i7 |
|
70 |
#define REG (REGWPTR[23]) |
|
71 |
#include "op_template.h" |
|
72 |
#define REGNAME l0 |
|
73 |
#define REG (REGWPTR[8]) |
|
74 |
#include "op_template.h" |
|
75 |
#define REGNAME l1 |
|
76 |
#define REG (REGWPTR[9]) |
|
77 |
#include "op_template.h" |
|
78 |
#define REGNAME l2 |
|
79 |
#define REG (REGWPTR[10]) |
|
80 |
#include "op_template.h" |
|
81 |
#define REGNAME l3 |
|
82 |
#define REG (REGWPTR[11]) |
|
83 |
#include "op_template.h" |
|
84 |
#define REGNAME l4 |
|
85 |
#define REG (REGWPTR[12]) |
|
86 |
#include "op_template.h" |
|
87 |
#define REGNAME l5 |
|
88 |
#define REG (REGWPTR[13]) |
|
89 |
#include "op_template.h" |
|
90 |
#define REGNAME l6 |
|
91 |
#define REG (REGWPTR[14]) |
|
92 |
#include "op_template.h" |
|
93 |
#define REGNAME l7 |
|
94 |
#define REG (REGWPTR[15]) |
|
95 |
#include "op_template.h" |
|
96 |
#define REGNAME o0 |
|
97 |
#define REG (REGWPTR[0]) |
|
98 |
#include "op_template.h" |
|
99 |
#define REGNAME o1 |
|
100 |
#define REG (REGWPTR[1]) |
|
101 |
#include "op_template.h" |
|
102 |
#define REGNAME o2 |
|
103 |
#define REG (REGWPTR[2]) |
|
104 |
#include "op_template.h" |
|
105 |
#define REGNAME o3 |
|
106 |
#define REG (REGWPTR[3]) |
|
107 |
#include "op_template.h" |
|
108 |
#define REGNAME o4 |
|
109 |
#define REG (REGWPTR[4]) |
|
110 |
#include "op_template.h" |
|
111 |
#define REGNAME o5 |
|
112 |
#define REG (REGWPTR[5]) |
|
113 |
#include "op_template.h" |
|
114 |
#define REGNAME o6 |
|
115 |
#define REG (REGWPTR[6]) |
|
116 |
#include "op_template.h" |
|
117 |
#define REGNAME o7 |
|
118 |
#define REG (REGWPTR[7]) |
|
119 |
#include "op_template.h" |
|
22 |
#include "helper.h" |
|
120 | 23 |
|
121 | 24 |
#define REGNAME f0 |
122 | 25 |
#define REG (env->fpr[0]) |
... | ... | |
267 | 170 |
#endif |
268 | 171 |
|
269 | 172 |
#ifdef TARGET_SPARC64 |
270 |
#ifdef WORDS_BIGENDIAN |
|
271 |
typedef union UREG64 { |
|
272 |
struct { uint16_t v3, v2, v1, v0; } w; |
|
273 |
struct { uint32_t v1, v0; } l; |
|
274 |
uint64_t q; |
|
275 |
} UREG64; |
|
276 |
#else |
|
277 |
typedef union UREG64 { |
|
278 |
struct { uint16_t v0, v1, v2, v3; } w; |
|
279 |
struct { uint32_t v0, v1; } l; |
|
280 |
uint64_t q; |
|
281 |
} UREG64; |
|
282 |
#endif |
|
283 |
|
|
284 |
#define PARAMQ1 \ |
|
285 |
({\ |
|
286 |
UREG64 __p;\ |
|
287 |
__p.l.v1 = PARAM1;\ |
|
288 |
__p.l.v0 = PARAM2;\ |
|
289 |
__p.q;\ |
|
290 |
}) |
|
291 |
|
|
292 |
void OPPROTO op_movq_T0_im64(void) |
|
293 |
{ |
|
294 |
T0 = PARAMQ1; |
|
295 |
} |
|
296 |
|
|
297 |
void OPPROTO op_movq_T1_im64(void) |
|
298 |
{ |
|
299 |
T1 = PARAMQ1; |
|
300 |
} |
|
301 |
|
|
302 | 173 |
#define XFLAG_SET(x) ((env->xcc&x)?1:0) |
303 |
|
|
304 |
#else |
|
305 |
#define EIP (env->pc) |
|
306 | 174 |
#endif |
307 | 175 |
|
308 | 176 |
#define FLAG_SET(x) ((env->psr&x)?1:0) |
309 | 177 |
|
310 |
void OPPROTO op_movl_T0_0(void) |
|
311 |
{ |
|
312 |
T0 = 0; |
|
313 |
} |
|
314 |
|
|
315 |
void OPPROTO op_movl_T0_im(void) |
|
316 |
{ |
|
317 |
T0 = (uint32_t)PARAM1; |
|
318 |
} |
|
319 |
|
|
320 |
void OPPROTO op_movl_T1_im(void) |
|
321 |
{ |
|
322 |
T1 = (uint32_t)PARAM1; |
|
323 |
} |
|
324 |
|
|
325 |
void OPPROTO op_movl_T2_im(void) |
|
326 |
{ |
|
327 |
T2 = (uint32_t)PARAM1; |
|
328 |
} |
|
329 |
|
|
330 |
void OPPROTO op_movl_T0_sim(void) |
|
331 |
{ |
|
332 |
T0 = (int32_t)PARAM1; |
|
333 |
} |
|
334 |
|
|
335 |
void OPPROTO op_movl_T1_sim(void) |
|
336 |
{ |
|
337 |
T1 = (int32_t)PARAM1; |
|
338 |
} |
|
339 |
|
|
340 |
void OPPROTO op_movl_T2_sim(void) |
|
341 |
{ |
|
342 |
T2 = (int32_t)PARAM1; |
|
343 |
} |
|
344 |
|
|
345 |
void OPPROTO op_movl_T0_env(void) |
|
346 |
{ |
|
347 |
T0 = *(uint32_t *)((char *)env + PARAM1); |
|
348 |
} |
|
349 |
|
|
350 |
void OPPROTO op_movl_env_T0(void) |
|
351 |
{ |
|
352 |
*(uint32_t *)((char *)env + PARAM1) = T0; |
|
353 |
} |
|
354 |
|
|
355 |
void OPPROTO op_movtl_T0_env(void) |
|
356 |
{ |
|
357 |
T0 = *(target_ulong *)((char *)env + PARAM1); |
|
358 |
} |
|
359 |
|
|
360 |
void OPPROTO op_movtl_env_T0(void) |
|
361 |
{ |
|
362 |
*(target_ulong *)((char *)env + PARAM1) = T0; |
|
363 |
} |
|
364 |
|
|
365 |
void OPPROTO op_add_T1_T0(void) |
|
366 |
{ |
|
367 |
T0 += T1; |
|
368 |
} |
|
369 |
|
|
370 | 178 |
void OPPROTO op_add_T1_T0_cc(void) |
371 | 179 |
{ |
372 | 180 |
target_ulong src1; |
... | ... | |
565 | 373 |
FORCE_RET(); |
566 | 374 |
} |
567 | 375 |
|
568 |
void OPPROTO op_sub_T1_T0(void) |
|
569 |
{ |
|
570 |
T0 -= T1; |
|
571 |
} |
|
572 |
|
|
573 | 376 |
void OPPROTO op_sub_T1_T0_cc(void) |
574 | 377 |
{ |
575 | 378 |
target_ulong src1; |
... | ... | |
765 | 568 |
FORCE_RET(); |
766 | 569 |
} |
767 | 570 |
|
768 |
void OPPROTO op_and_T1_T0(void) |
|
769 |
{ |
|
770 |
T0 &= T1; |
|
771 |
} |
|
772 |
|
|
773 |
void OPPROTO op_or_T1_T0(void) |
|
774 |
{ |
|
775 |
T0 |= T1; |
|
776 |
} |
|
777 |
|
|
778 |
void OPPROTO op_xor_T1_T0(void) |
|
779 |
{ |
|
780 |
T0 ^= T1; |
|
781 |
} |
|
782 |
|
|
783 | 571 |
void OPPROTO op_andn_T1_T0(void) |
784 | 572 |
{ |
785 | 573 |
T0 &= ~T1; |
... | ... | |
921 | 709 |
} |
922 | 710 |
|
923 | 711 |
#ifdef TARGET_SPARC64 |
924 |
void OPPROTO op_mulx_T1_T0(void) |
|
925 |
{ |
|
926 |
T0 *= T1; |
|
927 |
FORCE_RET(); |
|
928 |
} |
|
929 |
|
|
930 | 712 |
void OPPROTO op_udivx_T1_T0(void) |
931 | 713 |
{ |
932 | 714 |
if (T1 == 0) { |
... | ... | |
972 | 754 |
FORCE_RET(); |
973 | 755 |
} |
974 | 756 |
|
975 |
void OPPROTO op_sll(void) |
|
976 |
{ |
|
977 |
T0 <<= (T1 & 0x1f); |
|
978 |
} |
|
979 |
|
|
980 |
#ifdef TARGET_SPARC64 |
|
981 |
void OPPROTO op_sllx(void) |
|
982 |
{ |
|
983 |
T0 <<= (T1 & 0x3f); |
|
984 |
} |
|
985 |
|
|
986 |
void OPPROTO op_srl(void) |
|
987 |
{ |
|
988 |
T0 = (T0 & 0xffffffff) >> (T1 & 0x1f); |
|
989 |
} |
|
990 |
|
|
991 |
void OPPROTO op_srlx(void) |
|
992 |
{ |
|
993 |
T0 >>= (T1 & 0x3f); |
|
994 |
} |
|
995 |
|
|
996 |
void OPPROTO op_sra(void) |
|
997 |
{ |
|
998 |
T0 = ((int32_t) (T0 & 0xffffffff)) >> (T1 & 0x1f); |
|
999 |
} |
|
1000 |
|
|
1001 |
void OPPROTO op_srax(void) |
|
1002 |
{ |
|
1003 |
T0 = ((int64_t) T0) >> (T1 & 0x3f); |
|
1004 |
} |
|
1005 |
#else |
|
1006 |
void OPPROTO op_srl(void) |
|
1007 |
{ |
|
1008 |
T0 >>= (T1 & 0x1f); |
|
1009 |
} |
|
1010 |
|
|
1011 |
void OPPROTO op_sra(void) |
|
1012 |
{ |
|
1013 |
T0 = ((int32_t) T0) >> (T1 & 0x1f); |
|
1014 |
} |
|
1015 |
#endif |
|
1016 |
|
|
1017 | 757 |
/* Load and store */ |
1018 | 758 |
#define MEMSUFFIX _raw |
1019 | 759 |
#include "op_mem.h" |
... | ... | |
1042 | 782 |
} |
1043 | 783 |
|
1044 | 784 |
#ifndef TARGET_SPARC64 |
1045 |
void OPPROTO op_rdpsr(void) |
|
1046 |
{ |
|
1047 |
do_rdpsr(); |
|
1048 |
} |
|
1049 |
|
|
1050 |
void OPPROTO op_wrpsr(void) |
|
1051 |
{ |
|
1052 |
do_wrpsr(); |
|
1053 |
FORCE_RET(); |
|
1054 |
} |
|
1055 |
|
|
1056 |
void OPPROTO op_wrwim(void) |
|
1057 |
{ |
|
1058 |
#if NWINDOWS == 32 |
|
1059 |
env->wim = T0; |
|
1060 |
#else |
|
1061 |
env->wim = T0 & ((1 << NWINDOWS) - 1); |
|
1062 |
#endif |
|
1063 |
} |
|
1064 |
|
|
1065 |
void OPPROTO op_rett(void) |
|
1066 |
{ |
|
1067 |
helper_rett(); |
|
1068 |
FORCE_RET(); |
|
1069 |
} |
|
1070 |
|
|
1071 | 785 |
/* XXX: use another pointer for %iN registers to avoid slow wrapping |
1072 | 786 |
handling ? */ |
1073 | 787 |
void OPPROTO op_save(void) |
... | ... | |
1178 | 892 |
env->tt[env->tl] = T0; |
1179 | 893 |
} |
1180 | 894 |
|
1181 |
void OPPROTO op_rdpstate(void) |
|
1182 |
{ |
|
1183 |
T0 = env->pstate; |
|
1184 |
} |
|
1185 |
|
|
1186 |
void OPPROTO op_wrpstate(void) |
|
1187 |
{ |
|
1188 |
do_wrpstate(); |
|
1189 |
} |
|
1190 |
|
|
1191 | 895 |
// CWP handling is reversed in V9, but we still use the V8 register |
1192 | 896 |
// order. |
1193 | 897 |
void OPPROTO op_rdcwp(void) |
... | ... | |
1247 | 951 |
FORCE_RET(); |
1248 | 952 |
} |
1249 | 953 |
|
1250 |
void OPPROTO op_trap_T0(void) |
|
1251 |
{ |
|
1252 |
env->exception_index = TT_TRAP + (T0 & 0x7f); |
|
1253 |
cpu_loop_exit(); |
|
1254 |
FORCE_RET(); |
|
1255 |
} |
|
1256 |
|
|
1257 |
void OPPROTO op_trapcc_T0(void) |
|
1258 |
{ |
|
1259 |
if (T2) { |
|
1260 |
env->exception_index = TT_TRAP + (T0 & 0x7f); |
|
1261 |
cpu_loop_exit(); |
|
1262 |
} |
|
1263 |
FORCE_RET(); |
|
1264 |
} |
|
1265 |
|
|
1266 | 954 |
void OPPROTO op_fpexception_im(void) |
1267 | 955 |
{ |
1268 | 956 |
env->exception_index = TT_FP_EXCP; |
... | ... | |
1272 | 960 |
FORCE_RET(); |
1273 | 961 |
} |
1274 | 962 |
|
1275 |
void OPPROTO op_debug(void) |
|
1276 |
{ |
|
1277 |
helper_debug(); |
|
1278 |
} |
|
1279 |
|
|
1280 | 963 |
void OPPROTO op_eval_ba(void) |
1281 | 964 |
{ |
1282 | 965 |
T2 = 1; |
... | ... | |
1499 | 1182 |
{ |
1500 | 1183 |
T2 = ((int64_t)T0 >= 0); |
1501 | 1184 |
} |
1502 |
|
|
1503 |
void OPPROTO op_jmp_im64(void) |
|
1504 |
{ |
|
1505 |
env->pc = PARAMQ1; |
|
1506 |
} |
|
1507 |
|
|
1508 |
void OPPROTO op_movq_npc_im64(void) |
|
1509 |
{ |
|
1510 |
env->npc = PARAMQ1; |
|
1511 |
} |
|
1512 | 1185 |
#endif |
1513 | 1186 |
|
1514 |
void OPPROTO op_jmp_im(void) |
|
1515 |
{ |
|
1516 |
env->pc = (uint32_t)PARAM1; |
|
1517 |
} |
|
1518 |
|
|
1519 |
void OPPROTO op_movl_npc_im(void) |
|
1520 |
{ |
|
1521 |
env->npc = (uint32_t)PARAM1; |
|
1522 |
} |
|
1523 |
|
|
1524 |
void OPPROTO op_movl_npc_T0(void) |
|
1525 |
{ |
|
1526 |
env->npc = T0; |
|
1527 |
} |
|
1528 |
|
|
1529 | 1187 |
void OPPROTO op_mov_pc_npc(void) |
1530 | 1188 |
{ |
1531 | 1189 |
env->pc = env->npc; |
... | ... | |
1556 | 1214 |
FORCE_RET(); |
1557 | 1215 |
} |
1558 | 1216 |
|
1559 |
void OPPROTO op_flush_T0(void) |
|
1560 |
{ |
|
1561 |
helper_flush(T0); |
|
1562 |
} |
|
1563 |
|
|
1564 | 1217 |
void OPPROTO op_clear_ieee_excp_and_FTT(void) |
1565 | 1218 |
{ |
1566 | 1219 |
env->fsr &= ~(FSR_FTT_MASK | FSR_CEXC_MASK);; |
... | ... | |
1993 | 1646 |
env->otherwin--; |
1994 | 1647 |
FORCE_RET(); |
1995 | 1648 |
} |
1996 |
|
|
1997 |
void OPPROTO op_popc(void) |
|
1998 |
{ |
|
1999 |
do_popc(); |
|
2000 |
} |
|
2001 |
|
|
2002 |
void OPPROTO op_done(void) |
|
2003 |
{ |
|
2004 |
do_done(); |
|
2005 |
} |
|
2006 |
|
|
2007 |
void OPPROTO op_retry(void) |
|
2008 |
{ |
|
2009 |
do_retry(); |
|
2010 |
} |
|
2011 |
|
|
2012 |
void OPPROTO op_sir(void) |
|
2013 |
{ |
|
2014 |
T0 = 0; // XXX |
|
2015 |
} |
|
2016 |
|
|
2017 |
void OPPROTO op_ld_asi_reg() |
|
2018 |
{ |
|
2019 |
T0 += PARAM1; |
|
2020 |
helper_ld_asi(env->asi, PARAM2, PARAM3); |
|
2021 |
} |
|
2022 |
|
|
2023 |
void OPPROTO op_st_asi_reg() |
|
2024 |
{ |
|
2025 |
T0 += PARAM1; |
|
2026 |
helper_st_asi(env->asi, PARAM2); |
|
2027 |
} |
|
2028 |
|
|
2029 |
void OPPROTO op_ldf_asi_reg() |
|
2030 |
{ |
|
2031 |
T0 += PARAM1; |
|
2032 |
helper_ldf_asi(env->asi, PARAM2, PARAM3); |
|
2033 |
} |
|
2034 |
|
|
2035 |
void OPPROTO op_stf_asi_reg() |
|
2036 |
{ |
|
2037 |
T0 += PARAM1; |
|
2038 |
helper_stf_asi(env->asi, PARAM2, PARAM3); |
|
2039 |
} |
|
2040 |
|
|
2041 |
void OPPROTO op_ldf_asi() |
|
2042 |
{ |
|
2043 |
helper_ldf_asi(PARAM1, PARAM2, PARAM3); |
|
2044 |
} |
|
2045 |
|
|
2046 |
void OPPROTO op_stf_asi() |
|
2047 |
{ |
|
2048 |
helper_stf_asi(PARAM1, PARAM2, PARAM3); |
|
2049 |
} |
|
2050 |
|
|
2051 |
void OPPROTO op_ldstub_asi_reg() /* XXX: should be atomically */ |
|
2052 |
{ |
|
2053 |
target_ulong tmp; |
|
2054 |
|
|
2055 |
T0 += PARAM1; |
|
2056 |
helper_ld_asi(env->asi, 1, 0); |
|
2057 |
tmp = T1; |
|
2058 |
T1 = 0xff; |
|
2059 |
helper_st_asi(env->asi, 1); |
|
2060 |
T1 = tmp; |
|
2061 |
} |
|
2062 |
|
|
2063 |
void OPPROTO op_swap_asi_reg() /* XXX: should be atomically */ |
|
2064 |
{ |
|
2065 |
target_ulong tmp1, tmp2; |
|
2066 |
|
|
2067 |
T0 += PARAM1; |
|
2068 |
tmp1 = T1; |
|
2069 |
helper_ld_asi(env->asi, 4, 0); |
|
2070 |
tmp2 = T1; |
|
2071 |
T1 = tmp1; |
|
2072 |
helper_st_asi(env->asi, 4); |
|
2073 |
T1 = tmp2; |
|
2074 |
} |
|
2075 |
|
|
2076 |
void OPPROTO op_ldda_asi() |
|
2077 |
{ |
|
2078 |
helper_ld_asi(PARAM1, 8, 0); |
|
2079 |
T0 = T1 & 0xffffffffUL; |
|
2080 |
T1 >>= 32; |
|
2081 |
} |
|
2082 |
|
|
2083 |
void OPPROTO op_ldda_asi_reg() |
|
2084 |
{ |
|
2085 |
T0 += PARAM1; |
|
2086 |
helper_ld_asi(env->asi, 8, 0); |
|
2087 |
T0 = T1 & 0xffffffffUL; |
|
2088 |
T1 >>= 32; |
|
2089 |
} |
|
2090 |
|
|
2091 |
void OPPROTO op_stda_asi() |
|
2092 |
{ |
|
2093 |
T1 <<= 32; |
|
2094 |
T1 += T2 & 0xffffffffUL; |
|
2095 |
helper_st_asi(PARAM1, 8); |
|
2096 |
} |
|
2097 |
|
|
2098 |
void OPPROTO op_stda_asi_reg() |
|
2099 |
{ |
|
2100 |
T0 += PARAM1; |
|
2101 |
T1 <<= 32; |
|
2102 |
T1 += T2 & 0xffffffffUL; |
|
2103 |
helper_st_asi(env->asi, 8); |
|
2104 |
} |
|
2105 |
|
|
2106 |
void OPPROTO op_cas_asi() /* XXX: should be atomically */ |
|
2107 |
{ |
|
2108 |
target_ulong tmp; |
|
2109 |
|
|
2110 |
tmp = T1 & 0xffffffffUL; |
|
2111 |
helper_ld_asi(PARAM1, 4, 0); |
|
2112 |
if (tmp == T1) { |
|
2113 |
tmp = T1; |
|
2114 |
T1 = T2 & 0xffffffffUL; |
|
2115 |
helper_st_asi(PARAM1, 4); |
|
2116 |
T1 = tmp; |
|
2117 |
} |
|
2118 |
T1 &= 0xffffffffUL; |
|
2119 |
} |
|
2120 |
|
|
2121 |
void OPPROTO op_cas_asi_reg() /* XXX: should be atomically */ |
|
2122 |
{ |
|
2123 |
target_ulong tmp; |
|
2124 |
|
|
2125 |
T0 += PARAM1; |
|
2126 |
tmp = T1 & 0xffffffffUL; |
|
2127 |
helper_ld_asi(env->asi, 4, 0); |
|
2128 |
if (tmp == T1) { |
|
2129 |
tmp = T1; |
|
2130 |
T1 = T2 & 0xffffffffUL; |
|
2131 |
helper_st_asi(env->asi, 4); |
|
2132 |
T1 = tmp; |
|
2133 |
} |
|
2134 |
T1 &= 0xffffffffUL; |
|
2135 |
} |
|
2136 |
|
|
2137 |
void OPPROTO op_casx_asi() /* XXX: should be atomically */ |
|
2138 |
{ |
|
2139 |
target_ulong tmp; |
|
2140 |
|
|
2141 |
tmp = T1; |
|
2142 |
helper_ld_asi(PARAM1, 8, 0); |
|
2143 |
if (tmp == T1) { |
|
2144 |
tmp = T1; |
|
2145 |
T1 = T2; |
|
2146 |
helper_st_asi(PARAM1, 8); |
|
2147 |
T1 = tmp; |
|
2148 |
} |
|
2149 |
} |
|
2150 |
|
|
2151 |
void OPPROTO op_casx_asi_reg() /* XXX: should be atomically */ |
|
2152 |
{ |
|
2153 |
target_ulong tmp; |
|
2154 |
|
|
2155 |
T0 += PARAM1; |
|
2156 |
tmp = T1; |
|
2157 |
helper_ld_asi(env->asi, 8, 0); |
|
2158 |
if (tmp == T1) { |
|
2159 |
tmp = T1; |
|
2160 |
T1 = T2; |
|
2161 |
helper_st_asi(env->asi, 8); |
|
2162 |
T1 = tmp; |
|
2163 |
} |
|
2164 |
} |
|
2165 |
#endif |
|
2166 |
|
|
2167 |
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) |
|
2168 |
void OPPROTO op_ld_asi() |
|
2169 |
{ |
|
2170 |
helper_ld_asi(PARAM1, PARAM2, PARAM3); |
|
2171 |
} |
|
2172 |
|
|
2173 |
void OPPROTO op_st_asi() |
|
2174 |
{ |
|
2175 |
helper_st_asi(PARAM1, PARAM2); |
|
2176 |
} |
|
2177 |
|
|
2178 |
void OPPROTO op_ldstub_asi() /* XXX: should be atomically */ |
|
2179 |
{ |
|
2180 |
target_ulong tmp; |
|
2181 |
|
|
2182 |
helper_ld_asi(PARAM1, 1, 0); |
|
2183 |
tmp = T1; |
|
2184 |
T1 = 0xff; |
|
2185 |
helper_st_asi(PARAM1, 1); |
|
2186 |
T1 = tmp; |
|
2187 |
} |
|
2188 |
|
|
2189 |
void OPPROTO op_swap_asi() /* XXX: should be atomically */ |
|
2190 |
{ |
|
2191 |
target_ulong tmp1, tmp2; |
|
2192 |
|
|
2193 |
tmp1 = T1; |
|
2194 |
helper_ld_asi(PARAM1, 4, 0); |
|
2195 |
tmp2 = T1; |
|
2196 |
T1 = tmp1; |
|
2197 |
helper_st_asi(PARAM1, 4); |
|
2198 |
T1 = tmp2; |
|
2199 |
} |
|
2200 | 1649 |
#endif |
2201 | 1650 |
|
2202 | 1651 |
#ifdef TARGET_SPARC64 |
Also available in: Unified diff