Commit 31c18d87614063316b66faa6d7c05a876846488a
1 parent
780e264f
CRIS: Remove cpu_T.
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5552 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
155 additions
and
102 deletions
target-cris/exec.h
@@ -20,17 +20,8 @@ | @@ -20,17 +20,8 @@ | ||
20 | */ | 20 | */ |
21 | #include "dyngen-exec.h" | 21 | #include "dyngen-exec.h" |
22 | 22 | ||
23 | -#if 1 | ||
24 | register struct CPUCRISState *env asm(AREG0); | 23 | register struct CPUCRISState *env asm(AREG0); |
25 | -/* This is only used for tb lookup. */ | ||
26 | -register uint32_t T0 asm(AREG1); | ||
27 | -register uint32_t T1 asm(AREG2); | ||
28 | -#else | ||
29 | -struct CPUCRISState *env; | ||
30 | -/* This is only used for tb lookup. */ | ||
31 | -uint32_t T0; | ||
32 | -uint32_t T1; | ||
33 | -#endif | 24 | + |
34 | #include "cpu.h" | 25 | #include "cpu.h" |
35 | #include "exec-all.h" | 26 | #include "exec-all.h" |
36 | 27 |
target-cris/translate.c
@@ -62,7 +62,6 @@ | @@ -62,7 +62,6 @@ | ||
62 | #define CC_MASK_RNZV 0x10e | 62 | #define CC_MASK_RNZV 0x10e |
63 | 63 | ||
64 | static TCGv cpu_env; | 64 | static TCGv cpu_env; |
65 | -static TCGv cpu_T[2]; | ||
66 | static TCGv cpu_R[16]; | 65 | static TCGv cpu_R[16]; |
67 | static TCGv cpu_PR[16]; | 66 | static TCGv cpu_PR[16]; |
68 | static TCGv cc_x; | 67 | static TCGv cc_x; |
@@ -927,10 +926,15 @@ static void cris_alu(DisasContext *dc, int op, | @@ -927,10 +926,15 @@ static void cris_alu(DisasContext *dc, int op, | ||
927 | int writeback; | 926 | int writeback; |
928 | 927 | ||
929 | writeback = 1; | 928 | writeback = 1; |
930 | - tmp = cpu_T[0]; | ||
931 | - if (op == CC_OP_CMP) | 929 | + |
930 | + if (op == CC_OP_BOUND || op == CC_OP_BTST) | ||
931 | + tmp = tcg_temp_local_new(TCG_TYPE_TL); | ||
932 | + else | ||
933 | + tmp = tcg_temp_new(TCG_TYPE_TL); | ||
934 | + | ||
935 | + if (op == CC_OP_CMP) { | ||
932 | writeback = 0; | 936 | writeback = 0; |
933 | - else if (size == 4) { | 937 | + } else if (size == 4) { |
934 | tmp = d; | 938 | tmp = d; |
935 | writeback = 0; | 939 | writeback = 0; |
936 | } | 940 | } |
@@ -947,6 +951,8 @@ static void cris_alu(DisasContext *dc, int op, | @@ -947,6 +951,8 @@ static void cris_alu(DisasContext *dc, int op, | ||
947 | tcg_gen_andi_tl(d, d, ~0xffff); | 951 | tcg_gen_andi_tl(d, d, ~0xffff); |
948 | tcg_gen_or_tl(d, d, tmp); | 952 | tcg_gen_or_tl(d, d, tmp); |
949 | } | 953 | } |
954 | + if (tmp != d) | ||
955 | + tcg_temp_free(tmp); | ||
950 | } | 956 | } |
951 | 957 | ||
952 | static int arith_cc(DisasContext *dc) | 958 | static int arith_cc(DisasContext *dc) |
@@ -1401,14 +1407,13 @@ static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize, | @@ -1401,14 +1407,13 @@ static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize, | ||
1401 | /* Prepare T0 and T1 for a memory + alu operation. | 1407 | /* Prepare T0 and T1 for a memory + alu operation. |
1402 | s_ext decides if the operand1 should be sign-extended or zero-extended when | 1408 | s_ext decides if the operand1 should be sign-extended or zero-extended when |
1403 | needed. */ | 1409 | needed. */ |
1404 | -static int dec_prep_alu_m(DisasContext *dc, int s_ext, int memsize) | 1410 | +static int dec_prep_alu_m(DisasContext *dc, int s_ext, int memsize, |
1411 | + TCGv dst, TCGv src) | ||
1405 | { | 1412 | { |
1406 | int insn_len; | 1413 | int insn_len; |
1407 | 1414 | ||
1408 | - insn_len = dec_prep_move_m(dc, s_ext, memsize, cpu_T[1]); | ||
1409 | - | ||
1410 | - /* put dest in T0. */ | ||
1411 | - tcg_gen_mov_tl(cpu_T[0], cpu_R[dc->op2]); | 1415 | + insn_len = dec_prep_move_m(dc, s_ext, memsize, src); |
1416 | + tcg_gen_mov_tl(dst, cpu_R[dc->op2]); | ||
1412 | return insn_len; | 1417 | return insn_len; |
1413 | } | 1418 | } |
1414 | 1419 | ||
@@ -1536,16 +1541,18 @@ static unsigned int dec_orq(DisasContext *dc) | @@ -1536,16 +1541,18 @@ static unsigned int dec_orq(DisasContext *dc) | ||
1536 | } | 1541 | } |
1537 | static unsigned int dec_btstq(DisasContext *dc) | 1542 | static unsigned int dec_btstq(DisasContext *dc) |
1538 | { | 1543 | { |
1544 | + TCGv l0; | ||
1539 | dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4); | 1545 | dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4); |
1540 | DIS(fprintf (logfile, "btstq %u, $r%d\n", dc->op1, dc->op2)); | 1546 | DIS(fprintf (logfile, "btstq %u, $r%d\n", dc->op1, dc->op2)); |
1541 | 1547 | ||
1542 | cris_cc_mask(dc, CC_MASK_NZ); | 1548 | cris_cc_mask(dc, CC_MASK_NZ); |
1543 | - | 1549 | + l0 = tcg_temp_local_new(TCG_TYPE_TL); |
1544 | cris_alu(dc, CC_OP_BTST, | 1550 | cris_alu(dc, CC_OP_BTST, |
1545 | - cpu_T[0], cpu_R[dc->op2], tcg_const_tl(dc->op1), 4); | 1551 | + l0, cpu_R[dc->op2], tcg_const_tl(dc->op1), 4); |
1546 | cris_update_cc_op(dc, CC_OP_FLAGS, 4); | 1552 | cris_update_cc_op(dc, CC_OP_FLAGS, 4); |
1547 | - t_gen_mov_preg_TN(dc, PR_CCS, cpu_T[0]); | 1553 | + t_gen_mov_preg_TN(dc, PR_CCS, l0); |
1548 | dc->flags_uptodate = 1; | 1554 | dc->flags_uptodate = 1; |
1555 | + tcg_temp_free(l0); | ||
1549 | return 2; | 1556 | return 2; |
1550 | } | 1557 | } |
1551 | static unsigned int dec_asrq(DisasContext *dc) | 1558 | static unsigned int dec_asrq(DisasContext *dc) |
@@ -1807,8 +1814,8 @@ static unsigned int dec_bound_r(DisasContext *dc) | @@ -1807,8 +1814,8 @@ static unsigned int dec_bound_r(DisasContext *dc) | ||
1807 | cris_cc_mask(dc, CC_MASK_NZ); | 1814 | cris_cc_mask(dc, CC_MASK_NZ); |
1808 | l0 = tcg_temp_local_new(TCG_TYPE_TL); | 1815 | l0 = tcg_temp_local_new(TCG_TYPE_TL); |
1809 | dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, l0); | 1816 | dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, l0); |
1810 | - cris_alu(dc, CC_OP_BOUND, | ||
1811 | - cpu_R[dc->op2], cpu_R[dc->op2], l0, 4); | 1817 | + cris_alu(dc, CC_OP_BOUND, cpu_R[dc->op2], cpu_R[dc->op2], l0, 4); |
1818 | + tcg_temp_free(l0); | ||
1812 | return 2; | 1819 | return 2; |
1813 | } | 1820 | } |
1814 | 1821 | ||
@@ -1980,16 +1987,17 @@ static unsigned int dec_neg_r(DisasContext *dc) | @@ -1980,16 +1987,17 @@ static unsigned int dec_neg_r(DisasContext *dc) | ||
1980 | 1987 | ||
1981 | static unsigned int dec_btst_r(DisasContext *dc) | 1988 | static unsigned int dec_btst_r(DisasContext *dc) |
1982 | { | 1989 | { |
1990 | + TCGv l0; | ||
1983 | DIS(fprintf (logfile, "btst $r%u, $r%u\n", | 1991 | DIS(fprintf (logfile, "btst $r%u, $r%u\n", |
1984 | dc->op1, dc->op2)); | 1992 | dc->op1, dc->op2)); |
1985 | cris_cc_mask(dc, CC_MASK_NZ); | 1993 | cris_cc_mask(dc, CC_MASK_NZ); |
1986 | - dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0, cpu_T[0], cpu_T[1]); | ||
1987 | 1994 | ||
1988 | - cris_alu(dc, CC_OP_BTST, | ||
1989 | - cpu_T[0], cpu_T[0], cpu_T[1], 4); | 1995 | + l0 = tcg_temp_local_new(TCG_TYPE_TL); |
1996 | + cris_alu(dc, CC_OP_BTST, l0, cpu_R[dc->op2], cpu_R[dc->op1], 4); | ||
1990 | cris_update_cc_op(dc, CC_OP_FLAGS, 4); | 1997 | cris_update_cc_op(dc, CC_OP_FLAGS, 4); |
1991 | - t_gen_mov_preg_TN(dc, PR_CCS, cpu_T[0]); | 1998 | + t_gen_mov_preg_TN(dc, PR_CCS, l0); |
1992 | dc->flags_uptodate = 1; | 1999 | dc->flags_uptodate = 1; |
2000 | + tcg_temp_free(l0); | ||
1993 | return 2; | 2001 | return 2; |
1994 | } | 2002 | } |
1995 | 2003 | ||
@@ -2283,8 +2291,21 @@ static unsigned int dec_move_mr(DisasContext *dc) | @@ -2283,8 +2291,21 @@ static unsigned int dec_move_mr(DisasContext *dc) | ||
2283 | return insn_len; | 2291 | return insn_len; |
2284 | } | 2292 | } |
2285 | 2293 | ||
2294 | +static inline void cris_alu_m_alloc_temps(TCGv *t) | ||
2295 | +{ | ||
2296 | + t[0] = tcg_temp_new(TCG_TYPE_TL); | ||
2297 | + t[1] = tcg_temp_new(TCG_TYPE_TL); | ||
2298 | +} | ||
2299 | + | ||
2300 | +static inline void cris_alu_m_free_temps(TCGv *t) | ||
2301 | +{ | ||
2302 | + tcg_temp_free(t[0]); | ||
2303 | + tcg_temp_free(t[1]); | ||
2304 | +} | ||
2305 | + | ||
2286 | static unsigned int dec_movs_m(DisasContext *dc) | 2306 | static unsigned int dec_movs_m(DisasContext *dc) |
2287 | { | 2307 | { |
2308 | + TCGv t[2]; | ||
2288 | int memsize = memsize_z(dc); | 2309 | int memsize = memsize_z(dc); |
2289 | int insn_len; | 2310 | int insn_len; |
2290 | DIS(fprintf (logfile, "movs.%c [$r%u%s, $r%u\n", | 2311 | DIS(fprintf (logfile, "movs.%c [$r%u%s, $r%u\n", |
@@ -2292,17 +2313,20 @@ static unsigned int dec_movs_m(DisasContext *dc) | @@ -2292,17 +2313,20 @@ static unsigned int dec_movs_m(DisasContext *dc) | ||
2292 | dc->op1, dc->postinc ? "+]" : "]", | 2313 | dc->op1, dc->postinc ? "+]" : "]", |
2293 | dc->op2)); | 2314 | dc->op2)); |
2294 | 2315 | ||
2316 | + cris_alu_m_alloc_temps(t); | ||
2295 | /* sign extend. */ | 2317 | /* sign extend. */ |
2296 | - insn_len = dec_prep_alu_m(dc, 1, memsize); | 2318 | + insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); |
2297 | cris_cc_mask(dc, CC_MASK_NZ); | 2319 | cris_cc_mask(dc, CC_MASK_NZ); |
2298 | cris_alu(dc, CC_OP_MOVE, | 2320 | cris_alu(dc, CC_OP_MOVE, |
2299 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4); | 2321 | + cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); |
2300 | do_postinc(dc, memsize); | 2322 | do_postinc(dc, memsize); |
2323 | + cris_alu_m_free_temps(t); | ||
2301 | return insn_len; | 2324 | return insn_len; |
2302 | } | 2325 | } |
2303 | 2326 | ||
2304 | static unsigned int dec_addu_m(DisasContext *dc) | 2327 | static unsigned int dec_addu_m(DisasContext *dc) |
2305 | { | 2328 | { |
2329 | + TCGv t[2]; | ||
2306 | int memsize = memsize_z(dc); | 2330 | int memsize = memsize_z(dc); |
2307 | int insn_len; | 2331 | int insn_len; |
2308 | DIS(fprintf (logfile, "addu.%c [$r%u%s, $r%u\n", | 2332 | DIS(fprintf (logfile, "addu.%c [$r%u%s, $r%u\n", |
@@ -2310,17 +2334,20 @@ static unsigned int dec_addu_m(DisasContext *dc) | @@ -2310,17 +2334,20 @@ static unsigned int dec_addu_m(DisasContext *dc) | ||
2310 | dc->op1, dc->postinc ? "+]" : "]", | 2334 | dc->op1, dc->postinc ? "+]" : "]", |
2311 | dc->op2)); | 2335 | dc->op2)); |
2312 | 2336 | ||
2337 | + cris_alu_m_alloc_temps(t); | ||
2313 | /* sign extend. */ | 2338 | /* sign extend. */ |
2314 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2339 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); |
2315 | cris_cc_mask(dc, CC_MASK_NZVC); | 2340 | cris_cc_mask(dc, CC_MASK_NZVC); |
2316 | cris_alu(dc, CC_OP_ADD, | 2341 | cris_alu(dc, CC_OP_ADD, |
2317 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4); | 2342 | + cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); |
2318 | do_postinc(dc, memsize); | 2343 | do_postinc(dc, memsize); |
2344 | + cris_alu_m_free_temps(t); | ||
2319 | return insn_len; | 2345 | return insn_len; |
2320 | } | 2346 | } |
2321 | 2347 | ||
2322 | static unsigned int dec_adds_m(DisasContext *dc) | 2348 | static unsigned int dec_adds_m(DisasContext *dc) |
2323 | { | 2349 | { |
2350 | + TCGv t[2]; | ||
2324 | int memsize = memsize_z(dc); | 2351 | int memsize = memsize_z(dc); |
2325 | int insn_len; | 2352 | int insn_len; |
2326 | DIS(fprintf (logfile, "adds.%c [$r%u%s, $r%u\n", | 2353 | DIS(fprintf (logfile, "adds.%c [$r%u%s, $r%u\n", |
@@ -2328,17 +2355,19 @@ static unsigned int dec_adds_m(DisasContext *dc) | @@ -2328,17 +2355,19 @@ static unsigned int dec_adds_m(DisasContext *dc) | ||
2328 | dc->op1, dc->postinc ? "+]" : "]", | 2355 | dc->op1, dc->postinc ? "+]" : "]", |
2329 | dc->op2)); | 2356 | dc->op2)); |
2330 | 2357 | ||
2358 | + cris_alu_m_alloc_temps(t); | ||
2331 | /* sign extend. */ | 2359 | /* sign extend. */ |
2332 | - insn_len = dec_prep_alu_m(dc, 1, memsize); | 2360 | + insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); |
2333 | cris_cc_mask(dc, CC_MASK_NZVC); | 2361 | cris_cc_mask(dc, CC_MASK_NZVC); |
2334 | - cris_alu(dc, CC_OP_ADD, | ||
2335 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4); | 2362 | + cris_alu(dc, CC_OP_ADD, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); |
2336 | do_postinc(dc, memsize); | 2363 | do_postinc(dc, memsize); |
2364 | + cris_alu_m_free_temps(t); | ||
2337 | return insn_len; | 2365 | return insn_len; |
2338 | } | 2366 | } |
2339 | 2367 | ||
2340 | static unsigned int dec_subu_m(DisasContext *dc) | 2368 | static unsigned int dec_subu_m(DisasContext *dc) |
2341 | { | 2369 | { |
2370 | + TCGv t[2]; | ||
2342 | int memsize = memsize_z(dc); | 2371 | int memsize = memsize_z(dc); |
2343 | int insn_len; | 2372 | int insn_len; |
2344 | DIS(fprintf (logfile, "subu.%c [$r%u%s, $r%u\n", | 2373 | DIS(fprintf (logfile, "subu.%c [$r%u%s, $r%u\n", |
@@ -2346,17 +2375,19 @@ static unsigned int dec_subu_m(DisasContext *dc) | @@ -2346,17 +2375,19 @@ static unsigned int dec_subu_m(DisasContext *dc) | ||
2346 | dc->op1, dc->postinc ? "+]" : "]", | 2375 | dc->op1, dc->postinc ? "+]" : "]", |
2347 | dc->op2)); | 2376 | dc->op2)); |
2348 | 2377 | ||
2378 | + cris_alu_m_alloc_temps(t); | ||
2349 | /* sign extend. */ | 2379 | /* sign extend. */ |
2350 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2380 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); |
2351 | cris_cc_mask(dc, CC_MASK_NZVC); | 2381 | cris_cc_mask(dc, CC_MASK_NZVC); |
2352 | - cris_alu(dc, CC_OP_SUB, | ||
2353 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4); | 2382 | + cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); |
2354 | do_postinc(dc, memsize); | 2383 | do_postinc(dc, memsize); |
2384 | + cris_alu_m_free_temps(t); | ||
2355 | return insn_len; | 2385 | return insn_len; |
2356 | } | 2386 | } |
2357 | 2387 | ||
2358 | static unsigned int dec_subs_m(DisasContext *dc) | 2388 | static unsigned int dec_subs_m(DisasContext *dc) |
2359 | { | 2389 | { |
2390 | + TCGv t[2]; | ||
2360 | int memsize = memsize_z(dc); | 2391 | int memsize = memsize_z(dc); |
2361 | int insn_len; | 2392 | int insn_len; |
2362 | DIS(fprintf (logfile, "subs.%c [$r%u%s, $r%u\n", | 2393 | DIS(fprintf (logfile, "subs.%c [$r%u%s, $r%u\n", |
@@ -2364,17 +2395,19 @@ static unsigned int dec_subs_m(DisasContext *dc) | @@ -2364,17 +2395,19 @@ static unsigned int dec_subs_m(DisasContext *dc) | ||
2364 | dc->op1, dc->postinc ? "+]" : "]", | 2395 | dc->op1, dc->postinc ? "+]" : "]", |
2365 | dc->op2)); | 2396 | dc->op2)); |
2366 | 2397 | ||
2398 | + cris_alu_m_alloc_temps(t); | ||
2367 | /* sign extend. */ | 2399 | /* sign extend. */ |
2368 | - insn_len = dec_prep_alu_m(dc, 1, memsize); | 2400 | + insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); |
2369 | cris_cc_mask(dc, CC_MASK_NZVC); | 2401 | cris_cc_mask(dc, CC_MASK_NZVC); |
2370 | - cris_alu(dc, CC_OP_SUB, | ||
2371 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4); | 2402 | + cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); |
2372 | do_postinc(dc, memsize); | 2403 | do_postinc(dc, memsize); |
2404 | + cris_alu_m_free_temps(t); | ||
2373 | return insn_len; | 2405 | return insn_len; |
2374 | } | 2406 | } |
2375 | 2407 | ||
2376 | static unsigned int dec_movu_m(DisasContext *dc) | 2408 | static unsigned int dec_movu_m(DisasContext *dc) |
2377 | { | 2409 | { |
2410 | + TCGv t[2]; | ||
2378 | int memsize = memsize_z(dc); | 2411 | int memsize = memsize_z(dc); |
2379 | int insn_len; | 2412 | int insn_len; |
2380 | 2413 | ||
@@ -2383,16 +2416,18 @@ static unsigned int dec_movu_m(DisasContext *dc) | @@ -2383,16 +2416,18 @@ static unsigned int dec_movu_m(DisasContext *dc) | ||
2383 | dc->op1, dc->postinc ? "+]" : "]", | 2416 | dc->op1, dc->postinc ? "+]" : "]", |
2384 | dc->op2)); | 2417 | dc->op2)); |
2385 | 2418 | ||
2386 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2419 | + cris_alu_m_alloc_temps(t); |
2420 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2387 | cris_cc_mask(dc, CC_MASK_NZ); | 2421 | cris_cc_mask(dc, CC_MASK_NZ); |
2388 | - cris_alu(dc, CC_OP_MOVE, | ||
2389 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4); | 2422 | + cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); |
2390 | do_postinc(dc, memsize); | 2423 | do_postinc(dc, memsize); |
2424 | + cris_alu_m_free_temps(t); | ||
2391 | return insn_len; | 2425 | return insn_len; |
2392 | } | 2426 | } |
2393 | 2427 | ||
2394 | static unsigned int dec_cmpu_m(DisasContext *dc) | 2428 | static unsigned int dec_cmpu_m(DisasContext *dc) |
2395 | { | 2429 | { |
2430 | + TCGv t[2]; | ||
2396 | int memsize = memsize_z(dc); | 2431 | int memsize = memsize_z(dc); |
2397 | int insn_len; | 2432 | int insn_len; |
2398 | DIS(fprintf (logfile, "cmpu.%c [$r%u%s, $r%u\n", | 2433 | DIS(fprintf (logfile, "cmpu.%c [$r%u%s, $r%u\n", |
@@ -2400,16 +2435,18 @@ static unsigned int dec_cmpu_m(DisasContext *dc) | @@ -2400,16 +2435,18 @@ static unsigned int dec_cmpu_m(DisasContext *dc) | ||
2400 | dc->op1, dc->postinc ? "+]" : "]", | 2435 | dc->op1, dc->postinc ? "+]" : "]", |
2401 | dc->op2)); | 2436 | dc->op2)); |
2402 | 2437 | ||
2403 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2438 | + cris_alu_m_alloc_temps(t); |
2439 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2404 | cris_cc_mask(dc, CC_MASK_NZVC); | 2440 | cris_cc_mask(dc, CC_MASK_NZVC); |
2405 | - cris_alu(dc, CC_OP_CMP, | ||
2406 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4); | 2441 | + cris_alu(dc, CC_OP_CMP, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); |
2407 | do_postinc(dc, memsize); | 2442 | do_postinc(dc, memsize); |
2443 | + cris_alu_m_free_temps(t); | ||
2408 | return insn_len; | 2444 | return insn_len; |
2409 | } | 2445 | } |
2410 | 2446 | ||
2411 | static unsigned int dec_cmps_m(DisasContext *dc) | 2447 | static unsigned int dec_cmps_m(DisasContext *dc) |
2412 | { | 2448 | { |
2449 | + TCGv t[2]; | ||
2413 | int memsize = memsize_z(dc); | 2450 | int memsize = memsize_z(dc); |
2414 | int insn_len; | 2451 | int insn_len; |
2415 | DIS(fprintf (logfile, "cmps.%c [$r%u%s, $r%u\n", | 2452 | DIS(fprintf (logfile, "cmps.%c [$r%u%s, $r%u\n", |
@@ -2417,17 +2454,20 @@ static unsigned int dec_cmps_m(DisasContext *dc) | @@ -2417,17 +2454,20 @@ static unsigned int dec_cmps_m(DisasContext *dc) | ||
2417 | dc->op1, dc->postinc ? "+]" : "]", | 2454 | dc->op1, dc->postinc ? "+]" : "]", |
2418 | dc->op2)); | 2455 | dc->op2)); |
2419 | 2456 | ||
2420 | - insn_len = dec_prep_alu_m(dc, 1, memsize); | 2457 | + cris_alu_m_alloc_temps(t); |
2458 | + insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); | ||
2421 | cris_cc_mask(dc, CC_MASK_NZVC); | 2459 | cris_cc_mask(dc, CC_MASK_NZVC); |
2422 | cris_alu(dc, CC_OP_CMP, | 2460 | cris_alu(dc, CC_OP_CMP, |
2423 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], | 2461 | + cpu_R[dc->op2], cpu_R[dc->op2], t[1], |
2424 | memsize_zz(dc)); | 2462 | memsize_zz(dc)); |
2425 | do_postinc(dc, memsize); | 2463 | do_postinc(dc, memsize); |
2464 | + cris_alu_m_free_temps(t); | ||
2426 | return insn_len; | 2465 | return insn_len; |
2427 | } | 2466 | } |
2428 | 2467 | ||
2429 | static unsigned int dec_cmp_m(DisasContext *dc) | 2468 | static unsigned int dec_cmp_m(DisasContext *dc) |
2430 | { | 2469 | { |
2470 | + TCGv t[2]; | ||
2431 | int memsize = memsize_zz(dc); | 2471 | int memsize = memsize_zz(dc); |
2432 | int insn_len; | 2472 | int insn_len; |
2433 | DIS(fprintf (logfile, "cmp.%c [$r%u%s, $r%u\n", | 2473 | DIS(fprintf (logfile, "cmp.%c [$r%u%s, $r%u\n", |
@@ -2435,17 +2475,20 @@ static unsigned int dec_cmp_m(DisasContext *dc) | @@ -2435,17 +2475,20 @@ static unsigned int dec_cmp_m(DisasContext *dc) | ||
2435 | dc->op1, dc->postinc ? "+]" : "]", | 2475 | dc->op1, dc->postinc ? "+]" : "]", |
2436 | dc->op2)); | 2476 | dc->op2)); |
2437 | 2477 | ||
2438 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2478 | + cris_alu_m_alloc_temps(t); |
2479 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2439 | cris_cc_mask(dc, CC_MASK_NZVC); | 2480 | cris_cc_mask(dc, CC_MASK_NZVC); |
2440 | cris_alu(dc, CC_OP_CMP, | 2481 | cris_alu(dc, CC_OP_CMP, |
2441 | - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], | 2482 | + cpu_R[dc->op2], cpu_R[dc->op2], t[1], |
2442 | memsize_zz(dc)); | 2483 | memsize_zz(dc)); |
2443 | do_postinc(dc, memsize); | 2484 | do_postinc(dc, memsize); |
2485 | + cris_alu_m_free_temps(t); | ||
2444 | return insn_len; | 2486 | return insn_len; |
2445 | } | 2487 | } |
2446 | 2488 | ||
2447 | static unsigned int dec_test_m(DisasContext *dc) | 2489 | static unsigned int dec_test_m(DisasContext *dc) |
2448 | { | 2490 | { |
2491 | + TCGv t[2]; | ||
2449 | int memsize = memsize_zz(dc); | 2492 | int memsize = memsize_zz(dc); |
2450 | int insn_len; | 2493 | int insn_len; |
2451 | DIS(fprintf (logfile, "test.%d [$r%u%s] op2=%x\n", | 2494 | DIS(fprintf (logfile, "test.%d [$r%u%s] op2=%x\n", |
@@ -2455,19 +2498,21 @@ static unsigned int dec_test_m(DisasContext *dc) | @@ -2455,19 +2498,21 @@ static unsigned int dec_test_m(DisasContext *dc) | ||
2455 | 2498 | ||
2456 | cris_evaluate_flags(dc); | 2499 | cris_evaluate_flags(dc); |
2457 | 2500 | ||
2458 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2501 | + cris_alu_m_alloc_temps(t); |
2502 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2459 | cris_cc_mask(dc, CC_MASK_NZ); | 2503 | cris_cc_mask(dc, CC_MASK_NZ); |
2460 | tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~3); | 2504 | tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~3); |
2461 | 2505 | ||
2462 | cris_alu(dc, CC_OP_CMP, | 2506 | cris_alu(dc, CC_OP_CMP, |
2463 | - cpu_R[dc->op2], cpu_T[1], tcg_const_tl(0), | ||
2464 | - memsize_zz(dc)); | 2507 | + cpu_R[dc->op2], t[1], tcg_const_tl(0), memsize_zz(dc)); |
2465 | do_postinc(dc, memsize); | 2508 | do_postinc(dc, memsize); |
2509 | + cris_alu_m_free_temps(t); | ||
2466 | return insn_len; | 2510 | return insn_len; |
2467 | } | 2511 | } |
2468 | 2512 | ||
2469 | static unsigned int dec_and_m(DisasContext *dc) | 2513 | static unsigned int dec_and_m(DisasContext *dc) |
2470 | { | 2514 | { |
2515 | + TCGv t[2]; | ||
2471 | int memsize = memsize_zz(dc); | 2516 | int memsize = memsize_zz(dc); |
2472 | int insn_len; | 2517 | int insn_len; |
2473 | DIS(fprintf (logfile, "and.%d [$r%u%s, $r%u\n", | 2518 | DIS(fprintf (logfile, "and.%d [$r%u%s, $r%u\n", |
@@ -2475,17 +2520,18 @@ static unsigned int dec_and_m(DisasContext *dc) | @@ -2475,17 +2520,18 @@ static unsigned int dec_and_m(DisasContext *dc) | ||
2475 | dc->op1, dc->postinc ? "+]" : "]", | 2520 | dc->op1, dc->postinc ? "+]" : "]", |
2476 | dc->op2)); | 2521 | dc->op2)); |
2477 | 2522 | ||
2478 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2523 | + cris_alu_m_alloc_temps(t); |
2524 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2479 | cris_cc_mask(dc, CC_MASK_NZ); | 2525 | cris_cc_mask(dc, CC_MASK_NZ); |
2480 | - cris_alu(dc, CC_OP_AND, | ||
2481 | - cpu_R[dc->op2], cpu_T[0], cpu_T[1], | ||
2482 | - memsize_zz(dc)); | 2526 | + cris_alu(dc, CC_OP_AND, cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); |
2483 | do_postinc(dc, memsize); | 2527 | do_postinc(dc, memsize); |
2528 | + cris_alu_m_free_temps(t); | ||
2484 | return insn_len; | 2529 | return insn_len; |
2485 | } | 2530 | } |
2486 | 2531 | ||
2487 | static unsigned int dec_add_m(DisasContext *dc) | 2532 | static unsigned int dec_add_m(DisasContext *dc) |
2488 | { | 2533 | { |
2534 | + TCGv t[2]; | ||
2489 | int memsize = memsize_zz(dc); | 2535 | int memsize = memsize_zz(dc); |
2490 | int insn_len; | 2536 | int insn_len; |
2491 | DIS(fprintf (logfile, "add.%d [$r%u%s, $r%u\n", | 2537 | DIS(fprintf (logfile, "add.%d [$r%u%s, $r%u\n", |
@@ -2493,17 +2539,19 @@ static unsigned int dec_add_m(DisasContext *dc) | @@ -2493,17 +2539,19 @@ static unsigned int dec_add_m(DisasContext *dc) | ||
2493 | dc->op1, dc->postinc ? "+]" : "]", | 2539 | dc->op1, dc->postinc ? "+]" : "]", |
2494 | dc->op2)); | 2540 | dc->op2)); |
2495 | 2541 | ||
2496 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2542 | + cris_alu_m_alloc_temps(t); |
2543 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2497 | cris_cc_mask(dc, CC_MASK_NZVC); | 2544 | cris_cc_mask(dc, CC_MASK_NZVC); |
2498 | cris_alu(dc, CC_OP_ADD, | 2545 | cris_alu(dc, CC_OP_ADD, |
2499 | - cpu_R[dc->op2], cpu_T[0], cpu_T[1], | ||
2500 | - memsize_zz(dc)); | 2546 | + cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); |
2501 | do_postinc(dc, memsize); | 2547 | do_postinc(dc, memsize); |
2548 | + cris_alu_m_free_temps(t); | ||
2502 | return insn_len; | 2549 | return insn_len; |
2503 | } | 2550 | } |
2504 | 2551 | ||
2505 | static unsigned int dec_addo_m(DisasContext *dc) | 2552 | static unsigned int dec_addo_m(DisasContext *dc) |
2506 | { | 2553 | { |
2554 | + TCGv t[2]; | ||
2507 | int memsize = memsize_zz(dc); | 2555 | int memsize = memsize_zz(dc); |
2508 | int insn_len; | 2556 | int insn_len; |
2509 | DIS(fprintf (logfile, "add.%d [$r%u%s, $r%u\n", | 2557 | DIS(fprintf (logfile, "add.%d [$r%u%s, $r%u\n", |
@@ -2511,16 +2559,18 @@ static unsigned int dec_addo_m(DisasContext *dc) | @@ -2511,16 +2559,18 @@ static unsigned int dec_addo_m(DisasContext *dc) | ||
2511 | dc->op1, dc->postinc ? "+]" : "]", | 2559 | dc->op1, dc->postinc ? "+]" : "]", |
2512 | dc->op2)); | 2560 | dc->op2)); |
2513 | 2561 | ||
2514 | - insn_len = dec_prep_alu_m(dc, 1, memsize); | 2562 | + cris_alu_m_alloc_temps(t); |
2563 | + insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); | ||
2515 | cris_cc_mask(dc, 0); | 2564 | cris_cc_mask(dc, 0); |
2516 | - cris_alu(dc, CC_OP_ADD, | ||
2517 | - cpu_R[R_ACR], cpu_T[0], cpu_T[1], 4); | 2565 | + cris_alu(dc, CC_OP_ADD, cpu_R[R_ACR], t[0], t[1], 4); |
2518 | do_postinc(dc, memsize); | 2566 | do_postinc(dc, memsize); |
2567 | + cris_alu_m_free_temps(t); | ||
2519 | return insn_len; | 2568 | return insn_len; |
2520 | } | 2569 | } |
2521 | 2570 | ||
2522 | static unsigned int dec_bound_m(DisasContext *dc) | 2571 | static unsigned int dec_bound_m(DisasContext *dc) |
2523 | { | 2572 | { |
2573 | + TCGv l[2]; | ||
2524 | int memsize = memsize_zz(dc); | 2574 | int memsize = memsize_zz(dc); |
2525 | int insn_len; | 2575 | int insn_len; |
2526 | DIS(fprintf (logfile, "bound.%d [$r%u%s, $r%u\n", | 2576 | DIS(fprintf (logfile, "bound.%d [$r%u%s, $r%u\n", |
@@ -2528,32 +2578,38 @@ static unsigned int dec_bound_m(DisasContext *dc) | @@ -2528,32 +2578,38 @@ static unsigned int dec_bound_m(DisasContext *dc) | ||
2528 | dc->op1, dc->postinc ? "+]" : "]", | 2578 | dc->op1, dc->postinc ? "+]" : "]", |
2529 | dc->op2)); | 2579 | dc->op2)); |
2530 | 2580 | ||
2531 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2581 | + l[0] = tcg_temp_local_new(TCG_TYPE_TL); |
2582 | + l[1] = tcg_temp_local_new(TCG_TYPE_TL); | ||
2583 | + insn_len = dec_prep_alu_m(dc, 0, memsize, l[0], l[1]); | ||
2532 | cris_cc_mask(dc, CC_MASK_NZ); | 2584 | cris_cc_mask(dc, CC_MASK_NZ); |
2533 | - cris_alu(dc, CC_OP_BOUND, | ||
2534 | - cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4); | 2585 | + cris_alu(dc, CC_OP_BOUND, cpu_R[dc->op2], l[0], l[1], 4); |
2535 | do_postinc(dc, memsize); | 2586 | do_postinc(dc, memsize); |
2587 | + tcg_temp_free(l[0]); | ||
2588 | + tcg_temp_free(l[1]); | ||
2536 | return insn_len; | 2589 | return insn_len; |
2537 | } | 2590 | } |
2538 | 2591 | ||
2539 | static unsigned int dec_addc_mr(DisasContext *dc) | 2592 | static unsigned int dec_addc_mr(DisasContext *dc) |
2540 | { | 2593 | { |
2594 | + TCGv t[2]; | ||
2541 | int insn_len = 2; | 2595 | int insn_len = 2; |
2542 | DIS(fprintf (logfile, "addc [$r%u%s, $r%u\n", | 2596 | DIS(fprintf (logfile, "addc [$r%u%s, $r%u\n", |
2543 | dc->op1, dc->postinc ? "+]" : "]", | 2597 | dc->op1, dc->postinc ? "+]" : "]", |
2544 | dc->op2)); | 2598 | dc->op2)); |
2545 | 2599 | ||
2546 | cris_evaluate_flags(dc); | 2600 | cris_evaluate_flags(dc); |
2547 | - insn_len = dec_prep_alu_m(dc, 0, 4); | 2601 | + cris_alu_m_alloc_temps(t); |
2602 | + insn_len = dec_prep_alu_m(dc, 0, 4, t[0], t[1]); | ||
2548 | cris_cc_mask(dc, CC_MASK_NZVC); | 2603 | cris_cc_mask(dc, CC_MASK_NZVC); |
2549 | - cris_alu(dc, CC_OP_ADDC, | ||
2550 | - cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4); | 2604 | + cris_alu(dc, CC_OP_ADDC, cpu_R[dc->op2], t[0], t[1], 4); |
2551 | do_postinc(dc, 4); | 2605 | do_postinc(dc, 4); |
2606 | + cris_alu_m_free_temps(t); | ||
2552 | return insn_len; | 2607 | return insn_len; |
2553 | } | 2608 | } |
2554 | 2609 | ||
2555 | static unsigned int dec_sub_m(DisasContext *dc) | 2610 | static unsigned int dec_sub_m(DisasContext *dc) |
2556 | { | 2611 | { |
2612 | + TCGv t[2]; | ||
2557 | int memsize = memsize_zz(dc); | 2613 | int memsize = memsize_zz(dc); |
2558 | int insn_len; | 2614 | int insn_len; |
2559 | DIS(fprintf (logfile, "sub.%c [$r%u%s, $r%u ir=%x zz=%x\n", | 2615 | DIS(fprintf (logfile, "sub.%c [$r%u%s, $r%u ir=%x zz=%x\n", |
@@ -2561,16 +2617,18 @@ static unsigned int dec_sub_m(DisasContext *dc) | @@ -2561,16 +2617,18 @@ static unsigned int dec_sub_m(DisasContext *dc) | ||
2561 | dc->op1, dc->postinc ? "+]" : "]", | 2617 | dc->op1, dc->postinc ? "+]" : "]", |
2562 | dc->op2, dc->ir, dc->zzsize)); | 2618 | dc->op2, dc->ir, dc->zzsize)); |
2563 | 2619 | ||
2564 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2620 | + cris_alu_m_alloc_temps(t); |
2621 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2565 | cris_cc_mask(dc, CC_MASK_NZVC); | 2622 | cris_cc_mask(dc, CC_MASK_NZVC); |
2566 | - cris_alu(dc, CC_OP_SUB, | ||
2567 | - cpu_R[dc->op2], cpu_T[0], cpu_T[1], memsize); | 2623 | + cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], t[0], t[1], memsize); |
2568 | do_postinc(dc, memsize); | 2624 | do_postinc(dc, memsize); |
2625 | + cris_alu_m_free_temps(t); | ||
2569 | return insn_len; | 2626 | return insn_len; |
2570 | } | 2627 | } |
2571 | 2628 | ||
2572 | static unsigned int dec_or_m(DisasContext *dc) | 2629 | static unsigned int dec_or_m(DisasContext *dc) |
2573 | { | 2630 | { |
2631 | + TCGv t[2]; | ||
2574 | int memsize = memsize_zz(dc); | 2632 | int memsize = memsize_zz(dc); |
2575 | int insn_len; | 2633 | int insn_len; |
2576 | DIS(fprintf (logfile, "or.%d [$r%u%s, $r%u pc=%x\n", | 2634 | DIS(fprintf (logfile, "or.%d [$r%u%s, $r%u pc=%x\n", |
@@ -2578,16 +2636,19 @@ static unsigned int dec_or_m(DisasContext *dc) | @@ -2578,16 +2636,19 @@ static unsigned int dec_or_m(DisasContext *dc) | ||
2578 | dc->op1, dc->postinc ? "+]" : "]", | 2636 | dc->op1, dc->postinc ? "+]" : "]", |
2579 | dc->op2, dc->pc)); | 2637 | dc->op2, dc->pc)); |
2580 | 2638 | ||
2581 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2639 | + cris_alu_m_alloc_temps(t); |
2640 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2582 | cris_cc_mask(dc, CC_MASK_NZ); | 2641 | cris_cc_mask(dc, CC_MASK_NZ); |
2583 | cris_alu(dc, CC_OP_OR, | 2642 | cris_alu(dc, CC_OP_OR, |
2584 | - cpu_R[dc->op2], cpu_T[0], cpu_T[1], memsize_zz(dc)); | 2643 | + cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); |
2585 | do_postinc(dc, memsize); | 2644 | do_postinc(dc, memsize); |
2645 | + cris_alu_m_free_temps(t); | ||
2586 | return insn_len; | 2646 | return insn_len; |
2587 | } | 2647 | } |
2588 | 2648 | ||
2589 | static unsigned int dec_move_mp(DisasContext *dc) | 2649 | static unsigned int dec_move_mp(DisasContext *dc) |
2590 | { | 2650 | { |
2651 | + TCGv t[2]; | ||
2591 | int memsize = memsize_zz(dc); | 2652 | int memsize = memsize_zz(dc); |
2592 | int insn_len = 2; | 2653 | int insn_len = 2; |
2593 | 2654 | ||
@@ -2597,26 +2658,29 @@ static unsigned int dec_move_mp(DisasContext *dc) | @@ -2597,26 +2658,29 @@ static unsigned int dec_move_mp(DisasContext *dc) | ||
2597 | dc->postinc ? "+]" : "]", | 2658 | dc->postinc ? "+]" : "]", |
2598 | dc->op2)); | 2659 | dc->op2)); |
2599 | 2660 | ||
2600 | - insn_len = dec_prep_alu_m(dc, 0, memsize); | 2661 | + cris_alu_m_alloc_temps(t); |
2662 | + insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); | ||
2601 | cris_cc_mask(dc, 0); | 2663 | cris_cc_mask(dc, 0); |
2602 | if (dc->op2 == PR_CCS) { | 2664 | if (dc->op2 == PR_CCS) { |
2603 | cris_evaluate_flags(dc); | 2665 | cris_evaluate_flags(dc); |
2604 | if (dc->tb_flags & U_FLAG) { | 2666 | if (dc->tb_flags & U_FLAG) { |
2605 | /* User space is not allowed to touch all flags. */ | 2667 | /* User space is not allowed to touch all flags. */ |
2606 | - tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x39f); | ||
2607 | - tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], ~0x39f); | ||
2608 | - tcg_gen_or_tl(cpu_T[1], cpu_T[0], cpu_T[1]); | 2668 | + tcg_gen_andi_tl(t[1], t[1], 0x39f); |
2669 | + tcg_gen_andi_tl(t[0], cpu_PR[PR_CCS], ~0x39f); | ||
2670 | + tcg_gen_or_tl(t[1], t[0], t[1]); | ||
2609 | } | 2671 | } |
2610 | } | 2672 | } |
2611 | 2673 | ||
2612 | - t_gen_mov_preg_TN(dc, dc->op2, cpu_T[1]); | 2674 | + t_gen_mov_preg_TN(dc, dc->op2, t[1]); |
2613 | 2675 | ||
2614 | do_postinc(dc, memsize); | 2676 | do_postinc(dc, memsize); |
2677 | + cris_alu_m_free_temps(t); | ||
2615 | return insn_len; | 2678 | return insn_len; |
2616 | } | 2679 | } |
2617 | 2680 | ||
2618 | static unsigned int dec_move_pm(DisasContext *dc) | 2681 | static unsigned int dec_move_pm(DisasContext *dc) |
2619 | { | 2682 | { |
2683 | + TCGv t0; | ||
2620 | int memsize; | 2684 | int memsize; |
2621 | 2685 | ||
2622 | memsize = preg_sizes[dc->op2]; | 2686 | memsize = preg_sizes[dc->op2]; |
@@ -2628,9 +2692,11 @@ static unsigned int dec_move_pm(DisasContext *dc) | @@ -2628,9 +2692,11 @@ static unsigned int dec_move_pm(DisasContext *dc) | ||
2628 | /* prepare store. Address in T0, value in T1. */ | 2692 | /* prepare store. Address in T0, value in T1. */ |
2629 | if (dc->op2 == PR_CCS) | 2693 | if (dc->op2 == PR_CCS) |
2630 | cris_evaluate_flags(dc); | 2694 | cris_evaluate_flags(dc); |
2631 | - t_gen_mov_TN_preg(cpu_T[1], dc->op2); | 2695 | + t0 = tcg_temp_new(TCG_TYPE_TL); |
2696 | + t_gen_mov_TN_preg(t0, dc->op2); | ||
2632 | cris_flush_cc_state(dc); | 2697 | cris_flush_cc_state(dc); |
2633 | - gen_store(dc, cpu_R[dc->op1], cpu_T[1], memsize); | 2698 | + gen_store(dc, cpu_R[dc->op1], t0, memsize); |
2699 | + tcg_temp_free(t0); | ||
2634 | 2700 | ||
2635 | cris_cc_mask(dc, 0); | 2701 | cris_cc_mask(dc, 0); |
2636 | if (dc->postinc) | 2702 | if (dc->postinc) |
@@ -2641,24 +2707,27 @@ static unsigned int dec_move_pm(DisasContext *dc) | @@ -2641,24 +2707,27 @@ static unsigned int dec_move_pm(DisasContext *dc) | ||
2641 | static unsigned int dec_movem_mr(DisasContext *dc) | 2707 | static unsigned int dec_movem_mr(DisasContext *dc) |
2642 | { | 2708 | { |
2643 | TCGv tmp[16]; | 2709 | TCGv tmp[16]; |
2710 | + TCGv addr; | ||
2644 | int i; | 2711 | int i; |
2645 | int nr = dc->op2 + 1; | 2712 | int nr = dc->op2 + 1; |
2646 | 2713 | ||
2647 | DIS(fprintf (logfile, "movem [$r%u%s, $r%u\n", dc->op1, | 2714 | DIS(fprintf (logfile, "movem [$r%u%s, $r%u\n", dc->op1, |
2648 | dc->postinc ? "+]" : "]", dc->op2)); | 2715 | dc->postinc ? "+]" : "]", dc->op2)); |
2649 | 2716 | ||
2717 | + addr = tcg_temp_new(TCG_TYPE_TL); | ||
2650 | /* There are probably better ways of doing this. */ | 2718 | /* There are probably better ways of doing this. */ |
2651 | cris_flush_cc_state(dc); | 2719 | cris_flush_cc_state(dc); |
2652 | for (i = 0; i < (nr >> 1); i++) { | 2720 | for (i = 0; i < (nr >> 1); i++) { |
2653 | tmp[i] = tcg_temp_new(TCG_TYPE_I64); | 2721 | tmp[i] = tcg_temp_new(TCG_TYPE_I64); |
2654 | - tcg_gen_addi_tl(cpu_T[0], cpu_R[dc->op1], i * 8); | ||
2655 | - gen_load(dc, tmp[i], cpu_T[0], 8, 0); | 2722 | + tcg_gen_addi_tl(addr, cpu_R[dc->op1], i * 8); |
2723 | + gen_load(dc, tmp[i], addr, 8, 0); | ||
2656 | } | 2724 | } |
2657 | if (nr & 1) { | 2725 | if (nr & 1) { |
2658 | tmp[i] = tcg_temp_new(TCG_TYPE_I32); | 2726 | tmp[i] = tcg_temp_new(TCG_TYPE_I32); |
2659 | - tcg_gen_addi_tl(cpu_T[0], cpu_R[dc->op1], i * 8); | ||
2660 | - gen_load(dc, tmp[i], cpu_T[0], 4, 0); | 2727 | + tcg_gen_addi_tl(addr, cpu_R[dc->op1], i * 8); |
2728 | + gen_load(dc, tmp[i], addr, 4, 0); | ||
2661 | } | 2729 | } |
2730 | + tcg_temp_free(addr); | ||
2662 | 2731 | ||
2663 | for (i = 0; i < (nr >> 1); i++) { | 2732 | for (i = 0; i < (nr >> 1); i++) { |
2664 | tcg_gen_trunc_i64_i32(cpu_R[i * 2], tmp[i]); | 2733 | tcg_gen_trunc_i64_i32(cpu_R[i * 2], tmp[i]); |
@@ -2683,6 +2752,7 @@ static unsigned int dec_movem_mr(DisasContext *dc) | @@ -2683,6 +2752,7 @@ static unsigned int dec_movem_mr(DisasContext *dc) | ||
2683 | static unsigned int dec_movem_rm(DisasContext *dc) | 2752 | static unsigned int dec_movem_rm(DisasContext *dc) |
2684 | { | 2753 | { |
2685 | TCGv tmp; | 2754 | TCGv tmp; |
2755 | + TCGv addr; | ||
2686 | int i; | 2756 | int i; |
2687 | 2757 | ||
2688 | DIS(fprintf (logfile, "movem $r%u, [$r%u%s\n", dc->op2, dc->op1, | 2758 | DIS(fprintf (logfile, "movem $r%u, [$r%u%s\n", dc->op2, dc->op1, |
@@ -2691,18 +2761,20 @@ static unsigned int dec_movem_rm(DisasContext *dc) | @@ -2691,18 +2761,20 @@ static unsigned int dec_movem_rm(DisasContext *dc) | ||
2691 | cris_flush_cc_state(dc); | 2761 | cris_flush_cc_state(dc); |
2692 | 2762 | ||
2693 | tmp = tcg_temp_new(TCG_TYPE_TL); | 2763 | tmp = tcg_temp_new(TCG_TYPE_TL); |
2764 | + addr = tcg_temp_new(TCG_TYPE_TL); | ||
2694 | tcg_gen_movi_tl(tmp, 4); | 2765 | tcg_gen_movi_tl(tmp, 4); |
2695 | - tcg_gen_mov_tl(cpu_T[0], cpu_R[dc->op1]); | 2766 | + tcg_gen_mov_tl(addr, cpu_R[dc->op1]); |
2696 | for (i = 0; i <= dc->op2; i++) { | 2767 | for (i = 0; i <= dc->op2; i++) { |
2697 | /* Displace addr. */ | 2768 | /* Displace addr. */ |
2698 | /* Perform the store. */ | 2769 | /* Perform the store. */ |
2699 | - gen_store(dc, cpu_T[0], cpu_R[i], 4); | ||
2700 | - tcg_gen_add_tl(cpu_T[0], cpu_T[0], tmp); | 2770 | + gen_store(dc, addr, cpu_R[i], 4); |
2771 | + tcg_gen_add_tl(addr, addr, tmp); | ||
2701 | } | 2772 | } |
2702 | if (dc->postinc) | 2773 | if (dc->postinc) |
2703 | - tcg_gen_mov_tl(cpu_R[dc->op1], cpu_T[0]); | 2774 | + tcg_gen_mov_tl(cpu_R[dc->op1], addr); |
2704 | cris_cc_mask(dc, 0); | 2775 | cris_cc_mask(dc, 0); |
2705 | tcg_temp_free(tmp); | 2776 | tcg_temp_free(tmp); |
2777 | + tcg_temp_free(addr); | ||
2706 | return 2; | 2778 | return 2; |
2707 | } | 2779 | } |
2708 | 2780 | ||
@@ -2759,9 +2831,9 @@ static unsigned int dec_jump_p(DisasContext *dc) | @@ -2759,9 +2831,9 @@ static unsigned int dec_jump_p(DisasContext *dc) | ||
2759 | 2831 | ||
2760 | if (dc->op2 == PR_CCS) | 2832 | if (dc->op2 == PR_CCS) |
2761 | cris_evaluate_flags(dc); | 2833 | cris_evaluate_flags(dc); |
2762 | - t_gen_mov_TN_preg(cpu_T[0], dc->op2); | 2834 | + t_gen_mov_TN_preg(env_btarget, dc->op2); |
2763 | /* rete will often have low bit set to indicate delayslot. */ | 2835 | /* rete will often have low bit set to indicate delayslot. */ |
2764 | - tcg_gen_andi_tl(env_btarget, cpu_T[0], ~1); | 2836 | + tcg_gen_andi_tl(env_btarget, env_btarget, ~1); |
2765 | cris_cc_mask(dc, 0); | 2837 | cris_cc_mask(dc, 0); |
2766 | cris_prepare_jmp(dc, JMP_INDIRECT); | 2838 | cris_prepare_jmp(dc, JMP_INDIRECT); |
2767 | return 2; | 2839 | return 2; |
@@ -3429,16 +3501,6 @@ CPUCRISState *cpu_cris_init (const char *cpu_model) | @@ -3429,16 +3501,6 @@ CPUCRISState *cpu_cris_init (const char *cpu_model) | ||
3429 | tcg_initialized = 1; | 3501 | tcg_initialized = 1; |
3430 | 3502 | ||
3431 | cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); | 3503 | cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); |
3432 | -#if TARGET_LONG_BITS > HOST_LONG_BITS | ||
3433 | - cpu_T[0] = tcg_global_mem_new(TCG_TYPE_TL, | ||
3434 | - TCG_AREG0, offsetof(CPUState, t0), "T0"); | ||
3435 | - cpu_T[1] = tcg_global_mem_new(TCG_TYPE_TL, | ||
3436 | - TCG_AREG0, offsetof(CPUState, t1), "T1"); | ||
3437 | -#else | ||
3438 | - cpu_T[0] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG1, "T0"); | ||
3439 | - cpu_T[1] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG2, "T1"); | ||
3440 | -#endif | ||
3441 | - | ||
3442 | cc_x = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | 3504 | cc_x = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, |
3443 | offsetof(CPUState, cc_x), "cc_x"); | 3505 | offsetof(CPUState, cc_x), "cc_x"); |
3444 | cc_src = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | 3506 | cc_src = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, |