Commit 30abcfc7babe4bde680e1a04a1a6d0f1c041cc29

Authored by edgar_igl
1 parent 9bcd77d6

CRIS: Restructure the translator to allow for better code generation.

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4594 c046a42c-6fe2-441c-8c8c-71466251a162
target-cris/cpu.h
@@ -120,8 +120,7 @@ typedef struct CPUCRISState { @@ -120,8 +120,7 @@ typedef struct CPUCRISState {
120 uint32_t cc_result; 120 uint32_t cc_result;
121 /* size of the operation, 1 = byte, 2 = word, 4 = dword. */ 121 /* size of the operation, 1 = byte, 2 = word, 4 = dword. */
122 int cc_size; 122 int cc_size;
123 - /* Extended arithmetics. */  
124 - int cc_x_live; 123 + /* X flag at the time of cc snapshot. */
125 int cc_x; 124 int cc_x;
126 125
127 int exception_index; 126 int exception_index;
@@ -130,10 +129,6 @@ typedef struct CPUCRISState { @@ -130,10 +129,6 @@ typedef struct CPUCRISState {
130 int fault_vector; 129 int fault_vector;
131 int trap_vector; 130 int trap_vector;
132 131
133 - uint32_t debug1;  
134 - uint32_t debug2;  
135 - uint32_t debug3;  
136 -  
137 /* FIXME: add a check in the translator to avoid writing to support 132 /* FIXME: add a check in the translator to avoid writing to support
138 register sets beyond the 4th. The ISA allows up to 256! but in 133 register sets beyond the 4th. The ISA allows up to 256! but in
139 practice there is no core that implements more than 4. 134 practice there is no core that implements more than 4.
@@ -177,20 +172,14 @@ void do_interrupt(CPUCRISState *env); @@ -177,20 +172,14 @@ void do_interrupt(CPUCRISState *env);
177 is returned if the signal was handled by the virtual CPU. */ 172 is returned if the signal was handled by the virtual CPU. */
178 int cpu_cris_signal_handler(int host_signum, void *pinfo, 173 int cpu_cris_signal_handler(int host_signum, void *pinfo,
179 void *puc); 174 void *puc);
180 -void cpu_cris_flush_flags(CPUCRISState *, int);  
181 -  
182 -  
183 void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec, 175 void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
184 int is_asi); 176 int is_asi);
185 177
186 enum { 178 enum {
187 CC_OP_DYNAMIC, /* Use env->cc_op */ 179 CC_OP_DYNAMIC, /* Use env->cc_op */
188 CC_OP_FLAGS, 180 CC_OP_FLAGS,
189 - CC_OP_LOGIC,  
190 CC_OP_CMP, 181 CC_OP_CMP,
191 CC_OP_MOVE, 182 CC_OP_MOVE,
192 - CC_OP_MOVE_PD,  
193 - CC_OP_MOVE_SD,  
194 CC_OP_ADD, 183 CC_OP_ADD,
195 CC_OP_ADDC, 184 CC_OP_ADDC,
196 CC_OP_MCP, 185 CC_OP_MCP,
@@ -213,32 +202,6 @@ enum { @@ -213,32 +202,6 @@ enum {
213 CC_OP_LZ 202 CC_OP_LZ
214 }; 203 };
215 204
216 -#define CCF_C 0x01  
217 -#define CCF_V 0x02  
218 -#define CCF_Z 0x04  
219 -#define CCF_N 0x08  
220 -#define CCF_X 0x10  
221 -  
222 -#define CRIS_SSP 0  
223 -#define CRIS_USP 1  
224 -  
225 -void cris_set_irq_level(CPUCRISState *env, int level, uint8_t vector);  
226 -void cris_set_macsr(CPUCRISState *env, uint32_t val);  
227 -void cris_switch_sp(CPUCRISState *env);  
228 -  
229 -void do_cris_semihosting(CPUCRISState *env, int nr);  
230 -  
231 -enum cris_features {  
232 - CRIS_FEATURE_CF_ISA_MUL,  
233 -};  
234 -  
235 -static inline int cris_feature(CPUCRISState *env, int feature)  
236 -{  
237 - return (env->features & (1u << feature)) != 0;  
238 -}  
239 -  
240 -void register_cris_insns (CPUCRISState *env);  
241 -  
242 /* CRIS uses 8k pages. */ 205 /* CRIS uses 8k pages. */
243 #define TARGET_PAGE_BITS 13 206 #define TARGET_PAGE_BITS 13
244 #define MMAP_SHIFT TARGET_PAGE_BITS 207 #define MMAP_SHIFT TARGET_PAGE_BITS
target-cris/helper.c
@@ -42,9 +42,8 @@ int cpu_cris_handle_mmu_fault(CPUState * env, target_ulong address, int rw, @@ -42,9 +42,8 @@ int cpu_cris_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
42 int mmu_idx, int is_softmmu) 42 int mmu_idx, int is_softmmu)
43 { 43 {
44 env->exception_index = 0xaa; 44 env->exception_index = 0xaa;
45 - env->debug1 = address; 45 + env->pregs[PR_EDA] = address;
46 cpu_dump_state(env, stderr, fprintf, 0); 46 cpu_dump_state(env, stderr, fprintf, 0);
47 - env->pregs[PR_ERP] = env->pc;  
48 return 1; 47 return 1;
49 } 48 }
50 49
target-cris/helper.h
@@ -2,7 +2,6 @@ @@ -2,7 +2,6 @@
2 2
3 void TCG_HELPER_PROTO helper_raise_exception(uint32_t index); 3 void TCG_HELPER_PROTO helper_raise_exception(uint32_t index);
4 void TCG_HELPER_PROTO helper_tlb_flush_pid(uint32_t pid); 4 void TCG_HELPER_PROTO helper_tlb_flush_pid(uint32_t pid);
5 -void TCG_HELPER_PROTO helper_tlb_flush(void);  
6 void TCG_HELPER_PROTO helper_dump(uint32_t a0, uint32_t a1, uint32_t a2); 5 void TCG_HELPER_PROTO helper_dump(uint32_t a0, uint32_t a1, uint32_t a2);
7 void TCG_HELPER_PROTO helper_dummy(void); 6 void TCG_HELPER_PROTO helper_dummy(void);
8 void TCG_HELPER_PROTO helper_rfe(void); 7 void TCG_HELPER_PROTO helper_rfe(void);
@@ -18,3 +17,4 @@ void TCG_HELPER_PROTO helper_evaluate_flags_alu_4(void); @@ -18,3 +17,4 @@ void TCG_HELPER_PROTO helper_evaluate_flags_alu_4(void);
18 void TCG_HELPER_PROTO helper_evaluate_flags_move_4 (void); 17 void TCG_HELPER_PROTO helper_evaluate_flags_move_4 (void);
19 void TCG_HELPER_PROTO helper_evaluate_flags_move_2 (void); 18 void TCG_HELPER_PROTO helper_evaluate_flags_move_2 (void);
20 void TCG_HELPER_PROTO helper_evaluate_flags (void); 19 void TCG_HELPER_PROTO helper_evaluate_flags (void);
  20 +void TCG_HELPER_PROTO helper_top_evaluate_flags(void);
target-cris/op_helper.c
@@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
22 #include <assert.h> 22 #include <assert.h>
23 #include "exec.h" 23 #include "exec.h"
24 #include "mmu.h" 24 #include "mmu.h"
  25 +#include "helper.h"
25 26
26 #define MMUSUFFIX _mmu 27 #define MMUSUFFIX _mmu
27 28
@@ -67,6 +68,9 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr) @@ -67,6 +68,9 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
67 /* the PC is inside the translated code. It means that we have 68 /* the PC is inside the translated code. It means that we have
68 a virtual CPU fault */ 69 a virtual CPU fault */
69 cpu_restore_state(tb, env, pc, NULL); 70 cpu_restore_state(tb, env, pc, NULL);
  71 +
  72 + /* Evaluate flags after retranslation. */
  73 + helper_top_evaluate_flags();
70 } 74 }
71 } 75 }
72 cpu_loop_exit(); 76 cpu_loop_exit();
@@ -87,12 +91,7 @@ void helper_tlb_flush_pid(uint32_t pid) @@ -87,12 +91,7 @@ void helper_tlb_flush_pid(uint32_t pid)
87 #endif 91 #endif
88 } 92 }
89 93
90 -void helper_tlb_flush(void)  
91 -{  
92 - tlb_flush(env, 1);  
93 -}  
94 -  
95 -void helper_dump(uint32_t a0, uint32_t a1) 94 +void helper_dump(uint32_t a0, uint32_t a1, uint32_t a2)
96 { 95 {
97 (fprintf(logfile, "%s: a0=%x a1=%x\n", __func__, a0, a1)); 96 (fprintf(logfile, "%s: a0=%x a1=%x\n", __func__, a0, a1));
98 } 97 }
@@ -236,13 +235,7 @@ static void evaluate_flags_writeback(uint32_t flags) @@ -236,13 +235,7 @@ static void evaluate_flags_writeback(uint32_t flags)
236 int x; 235 int x;
237 236
238 /* Extended arithmetics, leave the z flag alone. */ 237 /* Extended arithmetics, leave the z flag alone. */
239 - env->debug3 = env->pregs[PR_CCS];  
240 -  
241 - if (env->cc_x_live)  
242 - x = env->cc_x;  
243 - else  
244 - x = env->pregs[PR_CCS] & X_FLAG;  
245 - 238 + x = env->cc_x;
246 if ((x || env->cc_op == CC_OP_ADDC) 239 if ((x || env->cc_op == CC_OP_ADDC)
247 && flags & Z_FLAG) 240 && flags & Z_FLAG)
248 env->cc_mask &= ~Z_FLAG; 241 env->cc_mask &= ~Z_FLAG;
@@ -359,7 +352,23 @@ void helper_evaluate_flags_alu_4(void) @@ -359,7 +352,23 @@ void helper_evaluate_flags_alu_4(void)
359 352
360 src = env->cc_src; 353 src = env->cc_src;
361 dst = env->cc_dest; 354 dst = env->cc_dest;
362 - res = env->cc_result; 355 +
  356 + /* Reconstruct the result. */
  357 + switch (env->cc_op)
  358 + {
  359 + case CC_OP_SUB:
  360 + res = dst - src;
  361 + break;
  362 + case CC_OP_ADD:
  363 + res = dst + src;
  364 + break;
  365 + default:
  366 + res = env->cc_result;
  367 + break;
  368 + }
  369 +
  370 + if (env->cc_op == CC_OP_SUB || env->cc_op == CC_OP_CMP)
  371 + src = ~src;
363 372
364 if ((res & 0x80000000L) != 0L) 373 if ((res & 0x80000000L) != 0L)
365 { 374 {
@@ -396,11 +405,9 @@ void helper_evaluate_flags_alu_4(void) @@ -396,11 +405,9 @@ void helper_evaluate_flags_alu_4(void)
396 405
397 void helper_evaluate_flags_move_4 (void) 406 void helper_evaluate_flags_move_4 (void)
398 { 407 {
399 - uint32_t src;  
400 uint32_t res; 408 uint32_t res;
401 uint32_t flags = 0; 409 uint32_t flags = 0;
402 410
403 - src = env->cc_src;  
404 res = env->cc_result; 411 res = env->cc_result;
405 412
406 if ((int32_t)res < 0) 413 if ((int32_t)res < 0)
@@ -440,6 +447,8 @@ void helper_evaluate_flags (void) @@ -440,6 +447,8 @@ void helper_evaluate_flags (void)
440 dst = env->cc_dest; 447 dst = env->cc_dest;
441 res = env->cc_result; 448 res = env->cc_result;
442 449
  450 + if (env->cc_op == CC_OP_SUB || env->cc_op == CC_OP_CMP)
  451 + src = ~src;
443 452
444 /* Now, evaluate the flags. This stuff is based on 453 /* Now, evaluate the flags. This stuff is based on
445 Per Zander's CRISv10 simulator. */ 454 Per Zander's CRISv10 simulator. */
@@ -548,3 +557,55 @@ void helper_evaluate_flags (void) @@ -548,3 +557,55 @@ void helper_evaluate_flags (void)
548 } 557 }
549 evaluate_flags_writeback(flags); 558 evaluate_flags_writeback(flags);
550 } 559 }
  560 +
  561 +void helper_top_evaluate_flags(void)
  562 +{
  563 + switch (env->cc_op)
  564 + {
  565 + case CC_OP_MCP:
  566 + helper_evaluate_flags_mcp();
  567 + break;
  568 + case CC_OP_MULS:
  569 + helper_evaluate_flags_muls();
  570 + break;
  571 + case CC_OP_MULU:
  572 + helper_evaluate_flags_mulu();
  573 + break;
  574 + case CC_OP_MOVE:
  575 + case CC_OP_AND:
  576 + case CC_OP_OR:
  577 + case CC_OP_XOR:
  578 + case CC_OP_ASR:
  579 + case CC_OP_LSR:
  580 + case CC_OP_LSL:
  581 + switch (env->cc_size)
  582 + {
  583 + case 4:
  584 + helper_evaluate_flags_move_4();
  585 + break;
  586 + case 2:
  587 + helper_evaluate_flags_move_2();
  588 + break;
  589 + default:
  590 + helper_evaluate_flags();
  591 + break;
  592 + }
  593 + break;
  594 + case CC_OP_FLAGS:
  595 + /* live. */
  596 + break;
  597 + default:
  598 + {
  599 + switch (env->cc_size)
  600 + {
  601 + case 4:
  602 + helper_evaluate_flags_alu_4();
  603 + break;
  604 + default:
  605 + helper_evaluate_flags();
  606 + break;
  607 + }
  608 + }
  609 + break;
  610 + }
  611 +}
target-cris/translate.c
@@ -65,6 +65,7 @@ TCGv cpu_env; @@ -65,6 +65,7 @@ TCGv cpu_env;
65 TCGv cpu_T[2]; 65 TCGv cpu_T[2];
66 TCGv cpu_R[16]; 66 TCGv cpu_R[16];
67 TCGv cpu_PR[16]; 67 TCGv cpu_PR[16];
  68 +TCGv cc_x;
68 TCGv cc_src; 69 TCGv cc_src;
69 TCGv cc_dest; 70 TCGv cc_dest;
70 TCGv cc_result; 71 TCGv cc_result;
@@ -93,12 +94,16 @@ typedef struct DisasContext { @@ -93,12 +94,16 @@ typedef struct DisasContext {
93 int cc_op; 94 int cc_op;
94 int cc_size; 95 int cc_size;
95 uint32_t cc_mask; 96 uint32_t cc_mask;
96 - int flags_live; /* Wether or not $ccs is uptodate. */  
97 - int flagx_live; /* Wether or not flags_x has the x flag known at  
98 - translation time. */ 97 +
  98 + int cc_size_uptodate; /* -1 invalid or last written value. */
  99 +
  100 + int cc_x_uptodate; /* 1 - ccs, 2 - known | X_FLAG. 0 not uptodate. */
  101 + int flags_uptodate; /* Wether or not $ccs is uptodate. */
  102 + int flagx_known; /* Wether or not flags_x has the x flag known at
  103 + translation time. */
99 int flags_x; 104 int flags_x;
100 - int clear_x; /* Clear x after this insn? */  
101 105
  106 + int clear_x; /* Clear x after this insn? */
102 int user; /* user or kernel mode. */ 107 int user; /* user or kernel mode. */
103 int is_jmp; 108 int is_jmp;
104 109
@@ -267,8 +272,8 @@ static void t_gen_muls(TCGv d, TCGv d2, TCGv a, TCGv b) @@ -267,8 +272,8 @@ static void t_gen_muls(TCGv d, TCGv d2, TCGv a, TCGv b)
267 tcg_gen_shri_i64(t0, t0, 32); 272 tcg_gen_shri_i64(t0, t0, 32);
268 tcg_gen_trunc_i64_i32(d2, t0); 273 tcg_gen_trunc_i64_i32(d2, t0);
269 274
270 - tcg_gen_discard_i64(t0);  
271 - tcg_gen_discard_i64(t1); 275 + tcg_temp_free(t0);
  276 + tcg_temp_free(t1);
272 } 277 }
273 278
274 /* 64-bit unsigned muls, lower result in d and upper in d2. */ 279 /* 64-bit unsigned muls, lower result in d and upper in d2. */
@@ -287,8 +292,8 @@ static void t_gen_mulu(TCGv d, TCGv d2, TCGv a, TCGv b) @@ -287,8 +292,8 @@ static void t_gen_mulu(TCGv d, TCGv d2, TCGv a, TCGv b)
287 tcg_gen_shri_i64(t0, t0, 32); 292 tcg_gen_shri_i64(t0, t0, 32);
288 tcg_gen_trunc_i64_i32(d2, t0); 293 tcg_gen_trunc_i64_i32(d2, t0);
289 294
290 - tcg_gen_discard_i64(t0);  
291 - tcg_gen_discard_i64(t1); 295 + tcg_temp_free(t0);
  296 + tcg_temp_free(t1);
292 } 297 }
293 298
294 /* 32bit branch-free binary search for counting leading zeros. */ 299 /* 32bit branch-free binary search for counting leading zeros. */
@@ -354,15 +359,16 @@ static void t_gen_lz_i32(TCGv d, TCGv x) @@ -354,15 +359,16 @@ static void t_gen_lz_i32(TCGv d, TCGv x)
354 tcg_gen_addi_i32(d, n, 2); 359 tcg_gen_addi_i32(d, n, 2);
355 tcg_gen_sub_i32(d, d, m); 360 tcg_gen_sub_i32(d, d, m);
356 361
357 - tcg_gen_discard_i32(y);  
358 - tcg_gen_discard_i32(m);  
359 - tcg_gen_discard_i32(n); 362 + tcg_temp_free(y);
  363 + tcg_temp_free(m);
  364 + tcg_temp_free(n);
360 } 365 }
361 366
362 -static void t_gen_btst(TCGv d, TCGv s) 367 +static void t_gen_btst(TCGv d, TCGv a, TCGv b)
363 { 368 {
364 TCGv sbit; 369 TCGv sbit;
365 TCGv bset; 370 TCGv bset;
  371 + TCGv t0;
366 int l1; 372 int l1;
367 373
368 /* des ref: 374 /* des ref:
@@ -390,18 +396,19 @@ static void t_gen_btst(TCGv d, TCGv s) @@ -390,18 +396,19 @@ static void t_gen_btst(TCGv d, TCGv s)
390 l1 = gen_new_label(); 396 l1 = gen_new_label();
391 sbit = tcg_temp_new(TCG_TYPE_TL); 397 sbit = tcg_temp_new(TCG_TYPE_TL);
392 bset = tcg_temp_new(TCG_TYPE_TL); 398 bset = tcg_temp_new(TCG_TYPE_TL);
  399 + t0 = tcg_temp_new(TCG_TYPE_TL);
393 400
394 /* Compute bset and sbit. */ 401 /* Compute bset and sbit. */
395 - tcg_gen_andi_tl(sbit, s, 31);  
396 - tcg_gen_shl_tl(s, tcg_const_tl(1), sbit);  
397 - tcg_gen_and_tl(bset, d, s); 402 + tcg_gen_andi_tl(sbit, b, 31);
  403 + tcg_gen_shl_tl(t0, tcg_const_tl(1), sbit);
  404 + tcg_gen_and_tl(bset, a, t0);
398 tcg_gen_shr_tl(bset, bset, sbit); 405 tcg_gen_shr_tl(bset, bset, sbit);
399 /* Displace to N_FLAG. */ 406 /* Displace to N_FLAG. */
400 tcg_gen_shli_tl(bset, bset, 3); 407 tcg_gen_shli_tl(bset, bset, 3);
401 408
402 tcg_gen_shl_tl(sbit, tcg_const_tl(2), sbit); 409 tcg_gen_shl_tl(sbit, tcg_const_tl(2), sbit);
403 tcg_gen_subi_tl(sbit, sbit, 1); 410 tcg_gen_subi_tl(sbit, sbit, 1);
404 - tcg_gen_and_tl(sbit, d, sbit); 411 + tcg_gen_and_tl(sbit, a, sbit);
405 412
406 tcg_gen_andi_tl(d, cpu_PR[PR_CCS], ~(X_FLAG | N_FLAG | Z_FLAG)); 413 tcg_gen_andi_tl(d, cpu_PR[PR_CCS], ~(X_FLAG | N_FLAG | Z_FLAG));
407 /* or in the N_FLAG. */ 414 /* or in the N_FLAG. */
@@ -411,11 +418,11 @@ static void t_gen_btst(TCGv d, TCGv s) @@ -411,11 +418,11 @@ static void t_gen_btst(TCGv d, TCGv s)
411 tcg_gen_ori_tl(d, d, Z_FLAG); 418 tcg_gen_ori_tl(d, d, Z_FLAG);
412 gen_set_label(l1); 419 gen_set_label(l1);
413 420
414 - tcg_gen_discard_tl(sbit);  
415 - tcg_gen_discard_tl(bset); 421 + tcg_temp_free(sbit);
  422 + tcg_temp_free(bset);
416 } 423 }
417 424
418 -static void t_gen_cris_dstep(TCGv d, TCGv s) 425 +static void t_gen_cris_dstep(TCGv d, TCGv a, TCGv b)
419 { 426 {
420 int l1; 427 int l1;
421 428
@@ -426,9 +433,9 @@ static void t_gen_cris_dstep(TCGv d, TCGv s) @@ -426,9 +433,9 @@ static void t_gen_cris_dstep(TCGv d, TCGv s)
426 * if (d >= s) 433 * if (d >= s)
427 * d -= s; 434 * d -= s;
428 */ 435 */
429 - tcg_gen_shli_tl(d, d, 1);  
430 - tcg_gen_brcond_tl(TCG_COND_LTU, d, s, l1);  
431 - tcg_gen_sub_tl(d, d, s); 436 + tcg_gen_shli_tl(d, a, 1);
  437 + tcg_gen_brcond_tl(TCG_COND_LTU, d, b, l1);
  438 + tcg_gen_sub_tl(d, d, b);
432 gen_set_label(l1); 439 gen_set_label(l1);
433 } 440 }
434 441
@@ -444,32 +451,56 @@ static inline void t_gen_add_flag(TCGv d, int flag) @@ -444,32 +451,56 @@ static inline void t_gen_add_flag(TCGv d, int flag)
444 if (flag) 451 if (flag)
445 tcg_gen_shri_tl(c, c, flag); 452 tcg_gen_shri_tl(c, c, flag);
446 tcg_gen_add_tl(d, d, c); 453 tcg_gen_add_tl(d, d, c);
447 - tcg_gen_discard_tl(c); 454 + tcg_temp_free(c);
448 } 455 }
449 456
450 -static inline void t_gen_addx_carry(TCGv d) 457 +static inline void t_gen_addx_carry(DisasContext *dc, TCGv d)
451 { 458 {
452 - TCGv x, c; 459 + if (dc->flagx_known) {
  460 + if (dc->flags_x) {
  461 + TCGv c;
  462 +
  463 + c = tcg_temp_new(TCG_TYPE_TL);
  464 + t_gen_mov_TN_preg(c, PR_CCS);
  465 + /* C flag is already at bit 0. */
  466 + tcg_gen_andi_tl(c, c, C_FLAG);
  467 + tcg_gen_add_tl(d, d, c);
  468 + tcg_temp_free(c);
  469 + }
  470 + } else {
  471 + TCGv x, c;
453 472
454 - x = tcg_temp_new(TCG_TYPE_TL);  
455 - c = tcg_temp_new(TCG_TYPE_TL);  
456 - t_gen_mov_TN_preg(x, PR_CCS);  
457 - tcg_gen_mov_tl(c, x); 473 + x = tcg_temp_new(TCG_TYPE_TL);
  474 + c = tcg_temp_new(TCG_TYPE_TL);
  475 + t_gen_mov_TN_preg(x, PR_CCS);
  476 + tcg_gen_mov_tl(c, x);
458 477
459 - /* Propagate carry into d if X is set. Branch free. */  
460 - tcg_gen_andi_tl(c, c, C_FLAG);  
461 - tcg_gen_andi_tl(x, x, X_FLAG);  
462 - tcg_gen_shri_tl(x, x, 4); 478 + /* Propagate carry into d if X is set. Branch free. */
  479 + tcg_gen_andi_tl(c, c, C_FLAG);
  480 + tcg_gen_andi_tl(x, x, X_FLAG);
  481 + tcg_gen_shri_tl(x, x, 4);
463 482
464 - tcg_gen_and_tl(x, x, c);  
465 - tcg_gen_add_tl(d, d, x);  
466 - tcg_gen_discard_tl(x);  
467 - tcg_gen_discard_tl(c); 483 + tcg_gen_and_tl(x, x, c);
  484 + tcg_gen_add_tl(d, d, x);
  485 + tcg_temp_free(x);
  486 + tcg_temp_free(c);
  487 + }
468 } 488 }
469 489
470 static inline void t_gen_subx_carry(DisasContext *dc, TCGv d) 490 static inline void t_gen_subx_carry(DisasContext *dc, TCGv d)
471 { 491 {
472 - if (dc->flagx_live) { 492 + if (dc->flagx_known) {
  493 + if (dc->flags_x) {
  494 + TCGv c;
  495 +
  496 + c = tcg_temp_new(TCG_TYPE_TL);
  497 + t_gen_mov_TN_preg(c, PR_CCS);
  498 + /* C flag is already at bit 0. */
  499 + tcg_gen_andi_tl(c, c, C_FLAG);
  500 + tcg_gen_sub_tl(d, d, c);
  501 + tcg_temp_free(c);
  502 + }
  503 + } else {
473 TCGv x, c; 504 TCGv x, c;
474 505
475 x = tcg_temp_new(TCG_TYPE_TL); 506 x = tcg_temp_new(TCG_TYPE_TL);
@@ -484,18 +515,8 @@ static inline void t_gen_subx_carry(DisasContext *dc, TCGv d) @@ -484,18 +515,8 @@ static inline void t_gen_subx_carry(DisasContext *dc, TCGv d)
484 515
485 tcg_gen_and_tl(x, x, c); 516 tcg_gen_and_tl(x, x, c);
486 tcg_gen_sub_tl(d, d, x); 517 tcg_gen_sub_tl(d, d, x);
487 - tcg_gen_discard_tl(x);  
488 - tcg_gen_discard_tl(c);  
489 - } else {  
490 - if (dc->flags_x) {  
491 - TCGv c;  
492 -  
493 - c = tcg_temp_new(TCG_TYPE_TL);  
494 - /* C flag is already at bit 0. */  
495 - tcg_gen_andi_tl(c, c, C_FLAG);  
496 - tcg_gen_add_tl(d, d, c);  
497 - tcg_gen_discard_tl(c);  
498 - } 518 + tcg_temp_free(x);
  519 + tcg_temp_free(c);
499 } 520 }
500 } 521 }
501 522
@@ -515,8 +536,8 @@ static inline void t_gen_swapb(TCGv d, TCGv s) @@ -515,8 +536,8 @@ static inline void t_gen_swapb(TCGv d, TCGv s)
515 tcg_gen_shri_tl(t, org_s, 8); 536 tcg_gen_shri_tl(t, org_s, 8);
516 tcg_gen_andi_tl(t, t, 0x00ff00ff); 537 tcg_gen_andi_tl(t, t, 0x00ff00ff);
517 tcg_gen_or_tl(d, d, t); 538 tcg_gen_or_tl(d, d, t);
518 - tcg_gen_discard_tl(t);  
519 - tcg_gen_discard_tl(org_s); 539 + tcg_temp_free(t);
  540 + tcg_temp_free(org_s);
520 } 541 }
521 542
522 /* Swap the halfwords of the s operand. */ 543 /* Swap the halfwords of the s operand. */
@@ -529,7 +550,7 @@ static inline void t_gen_swapw(TCGv d, TCGv s) @@ -529,7 +550,7 @@ static inline void t_gen_swapw(TCGv d, TCGv s)
529 tcg_gen_shli_tl(d, t, 16); 550 tcg_gen_shli_tl(d, t, 16);
530 tcg_gen_shri_tl(t, t, 16); 551 tcg_gen_shri_tl(t, t, 16);
531 tcg_gen_or_tl(d, d, t); 552 tcg_gen_or_tl(d, d, t);
532 - tcg_gen_discard_tl(t); 553 + tcg_temp_free(t);
533 } 554 }
534 555
535 /* Reverse the within each byte. 556 /* Reverse the within each byte.
@@ -576,8 +597,8 @@ static inline void t_gen_swapr(TCGv d, TCGv s) @@ -576,8 +597,8 @@ static inline void t_gen_swapr(TCGv d, TCGv s)
576 tcg_gen_andi_tl(t, t, bitrev[i].mask); 597 tcg_gen_andi_tl(t, t, bitrev[i].mask);
577 tcg_gen_or_tl(d, d, t); 598 tcg_gen_or_tl(d, d, t);
578 } 599 }
579 - tcg_gen_discard_tl(t);  
580 - tcg_gen_discard_tl(org_s); 600 + tcg_temp_free(t);
  601 + tcg_temp_free(org_s);
581 } 602 }
582 603
583 static void t_gen_cc_jmp(TCGv pc_true, TCGv pc_false) 604 static void t_gen_cc_jmp(TCGv pc_true, TCGv pc_false)
@@ -595,7 +616,7 @@ static void t_gen_cc_jmp(TCGv pc_true, TCGv pc_false) @@ -595,7 +616,7 @@ static void t_gen_cc_jmp(TCGv pc_true, TCGv pc_false)
595 tcg_gen_mov_tl(env_pc, pc_true); 616 tcg_gen_mov_tl(env_pc, pc_true);
596 gen_set_label(l1); 617 gen_set_label(l1);
597 618
598 - tcg_gen_discard_tl(btaken); 619 + tcg_temp_free(btaken);
599 } 620 }
600 621
601 static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest) 622 static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest)
@@ -627,20 +648,24 @@ static int sign_extend(unsigned int val, unsigned int width) @@ -627,20 +648,24 @@ static int sign_extend(unsigned int val, unsigned int width)
627 648
628 static inline void cris_clear_x_flag(DisasContext *dc) 649 static inline void cris_clear_x_flag(DisasContext *dc)
629 { 650 {
630 - if (!dc->flagx_live  
631 - || (dc->flagx_live && dc->flags_x)  
632 - || dc->cc_op == CC_OP_FLAGS)  
633 - tcg_gen_andi_i32(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~X_FLAG);  
634 - dc->flagx_live = 1; 651 + dc->flagx_known = 1;
635 dc->flags_x = 0; 652 dc->flags_x = 0;
636 } 653 }
637 654
638 -static void cris_evaluate_flags(DisasContext *dc) 655 +static void cris_flush_cc_state(DisasContext *dc)
639 { 656 {
640 - if (!dc->flags_live) {  
641 - tcg_gen_movi_tl(cc_op, dc->cc_op); 657 + if (dc->cc_size_uptodate != dc->cc_size) {
642 tcg_gen_movi_tl(cc_size, dc->cc_size); 658 tcg_gen_movi_tl(cc_size, dc->cc_size);
643 - tcg_gen_movi_tl(cc_mask, dc->cc_mask); 659 + dc->cc_size_uptodate = dc->cc_size;
  660 + }
  661 + tcg_gen_movi_tl(cc_op, dc->cc_op);
  662 + tcg_gen_movi_tl(cc_mask, dc->cc_mask);
  663 +}
  664 +
  665 +static void cris_evaluate_flags(DisasContext *dc)
  666 +{
  667 + if (!dc->flags_uptodate) {
  668 + cris_flush_cc_state(dc);
644 669
645 switch (dc->cc_op) 670 switch (dc->cc_op)
646 { 671 {
@@ -654,6 +679,12 @@ static void cris_evaluate_flags(DisasContext *dc) @@ -654,6 +679,12 @@ static void cris_evaluate_flags(DisasContext *dc)
654 tcg_gen_helper_0_0(helper_evaluate_flags_mulu); 679 tcg_gen_helper_0_0(helper_evaluate_flags_mulu);
655 break; 680 break;
656 case CC_OP_MOVE: 681 case CC_OP_MOVE:
  682 + case CC_OP_AND:
  683 + case CC_OP_OR:
  684 + case CC_OP_XOR:
  685 + case CC_OP_ASR:
  686 + case CC_OP_LSR:
  687 + case CC_OP_LSL:
657 switch (dc->cc_size) 688 switch (dc->cc_size)
658 { 689 {
659 case 4: 690 case 4:
@@ -684,7 +715,7 @@ static void cris_evaluate_flags(DisasContext *dc) @@ -684,7 +715,7 @@ static void cris_evaluate_flags(DisasContext *dc)
684 } 715 }
685 break; 716 break;
686 } 717 }
687 - dc->flags_live = 1; 718 + dc->flags_uptodate = 1;
688 } 719 }
689 } 720 }
690 721
@@ -705,132 +736,144 @@ static void cris_cc_mask(DisasContext *dc, unsigned int mask) @@ -705,132 +736,144 @@ static void cris_cc_mask(DisasContext *dc, unsigned int mask)
705 if (mask == 0) 736 if (mask == 0)
706 dc->update_cc = 0; 737 dc->update_cc = 0;
707 else 738 else
708 - dc->flags_live = 0; 739 + dc->flags_uptodate = 0;
709 } 740 }
710 741
711 static void cris_update_cc_op(DisasContext *dc, int op, int size) 742 static void cris_update_cc_op(DisasContext *dc, int op, int size)
712 { 743 {
713 dc->cc_op = op; 744 dc->cc_op = op;
714 dc->cc_size = size; 745 dc->cc_size = size;
715 - dc->flags_live = 0; 746 + dc->flags_uptodate = 0;
716 } 747 }
717 748
718 -/* op is the operation.  
719 - T0, T1 are the operands.  
720 - dst is the destination reg.  
721 -*/  
722 -static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) 749 +static inline void cris_update_cc_x(DisasContext *dc)
  750 +{
  751 + /* Save the x flag state at the time of the cc snapshot. */
  752 + if (dc->flagx_known) {
  753 + if (dc->cc_x_uptodate == (2 | dc->flags_x))
  754 + return;
  755 + tcg_gen_movi_tl(cc_x, dc->flags_x);
  756 + dc->cc_x_uptodate = 2 | dc->flags_x;
  757 + }
  758 + else {
  759 + tcg_gen_andi_tl(cc_x, cpu_PR[PR_CCS], X_FLAG);
  760 + dc->cc_x_uptodate = 1;
  761 + }
  762 +}
  763 +
  764 +/* Update cc prior to executing ALU op. Needs source operands untouched. */
  765 +static void cris_pre_alu_update_cc(DisasContext *dc, int op,
  766 + TCGv dst, TCGv src, int size)
723 { 767 {
724 - int writeback = 1;  
725 if (dc->update_cc) { 768 if (dc->update_cc) {
726 cris_update_cc_op(dc, op, size); 769 cris_update_cc_op(dc, op, size);
727 - if (op != CC_OP_MOVE)  
728 - tcg_gen_mov_tl(cc_dest, cpu_T[0]); 770 + tcg_gen_mov_tl(cc_src, src);
  771 +
  772 + if (op != CC_OP_MOVE
  773 + && op != CC_OP_AND
  774 + && op != CC_OP_OR
  775 + && op != CC_OP_XOR
  776 + && op != CC_OP_ASR
  777 + && op != CC_OP_LSR
  778 + && op != CC_OP_LSL)
  779 + tcg_gen_mov_tl(cc_dest, dst);
  780 +
  781 + cris_update_cc_x(dc);
  782 + }
  783 +}
729 784
730 - /* FIXME: This shouldn't be needed. But we don't pass the  
731 - tests without it. Investigate. */  
732 - t_gen_mov_env_TN(cc_x_live, tcg_const_tl(dc->flagx_live));  
733 - t_gen_mov_env_TN(cc_x, tcg_const_tl(dc->flags_x)); 785 +/* Update cc after executing ALU op. needs the result. */
  786 +static inline void cris_update_result(DisasContext *dc, TCGv res)
  787 +{
  788 + if (dc->update_cc) {
  789 + if (dc->cc_size == 4 &&
  790 + (dc->cc_op == CC_OP_SUB
  791 + || dc->cc_op == CC_OP_ADD))
  792 + return;
  793 + tcg_gen_mov_tl(cc_result, res);
734 } 794 }
  795 +}
735 796
  797 +/* Returns one if the write back stage should execute. */
  798 +static void cris_alu_op_exec(DisasContext *dc, int op,
  799 + TCGv dst, TCGv a, TCGv b, int size)
  800 +{
736 /* Emit the ALU insns. */ 801 /* Emit the ALU insns. */
737 switch (op) 802 switch (op)
738 { 803 {
739 case CC_OP_ADD: 804 case CC_OP_ADD:
740 - tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); 805 + tcg_gen_add_tl(dst, a, b);
741 /* Extended arithmetics. */ 806 /* Extended arithmetics. */
742 - t_gen_addx_carry(cpu_T[0]); 807 + t_gen_addx_carry(dc, dst);
743 break; 808 break;
744 case CC_OP_ADDC: 809 case CC_OP_ADDC:
745 - tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);  
746 - t_gen_add_flag(cpu_T[0], 0); /* C_FLAG. */ 810 + tcg_gen_add_tl(dst, a, b);
  811 + t_gen_add_flag(dst, 0); /* C_FLAG. */
747 break; 812 break;
748 case CC_OP_MCP: 813 case CC_OP_MCP:
749 - tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);  
750 - t_gen_add_flag(cpu_T[0], 8); /* R_FLAG. */ 814 + tcg_gen_add_tl(dst, a, b);
  815 + t_gen_add_flag(dst, 8); /* R_FLAG. */
751 break; 816 break;
752 case CC_OP_SUB: 817 case CC_OP_SUB:
753 - tcg_gen_neg_tl(cpu_T[1], cpu_T[1]);  
754 - tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);  
755 - tcg_gen_neg_tl(cpu_T[1], cpu_T[1]);  
756 - /* CRIS flag evaluation needs ~src. */  
757 - tcg_gen_not_tl(cpu_T[1], cpu_T[1]);  
758 - 818 + tcg_gen_sub_tl(dst, a, b);
759 /* Extended arithmetics. */ 819 /* Extended arithmetics. */
760 - t_gen_subx_carry(dc, cpu_T[0]); 820 + t_gen_subx_carry(dc, dst);
761 break; 821 break;
762 case CC_OP_MOVE: 822 case CC_OP_MOVE:
763 - tcg_gen_mov_tl(cpu_T[0], cpu_T[1]); 823 + tcg_gen_mov_tl(dst, b);
764 break; 824 break;
765 case CC_OP_OR: 825 case CC_OP_OR:
766 - tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]); 826 + tcg_gen_or_tl(dst, a, b);
767 break; 827 break;
768 case CC_OP_AND: 828 case CC_OP_AND:
769 - tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]); 829 + tcg_gen_and_tl(dst, a, b);
770 break; 830 break;
771 case CC_OP_XOR: 831 case CC_OP_XOR:
772 - tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]); 832 + tcg_gen_xor_tl(dst, a, b);
773 break; 833 break;
774 case CC_OP_LSL: 834 case CC_OP_LSL:
775 - t_gen_lsl(cpu_T[0], cpu_T[0], cpu_T[1]); 835 + t_gen_lsl(dst, a, b);
776 break; 836 break;
777 case CC_OP_LSR: 837 case CC_OP_LSR:
778 - t_gen_lsr(cpu_T[0], cpu_T[0], cpu_T[1]); 838 + t_gen_lsr(dst, a, b);
779 break; 839 break;
780 case CC_OP_ASR: 840 case CC_OP_ASR:
781 - t_gen_asr(cpu_T[0], cpu_T[0], cpu_T[1]); 841 + t_gen_asr(dst, a, b);
782 break; 842 break;
783 case CC_OP_NEG: 843 case CC_OP_NEG:
784 - tcg_gen_neg_tl(cpu_T[0], cpu_T[1]); 844 + tcg_gen_neg_tl(dst, b);
785 /* Extended arithmetics. */ 845 /* Extended arithmetics. */
786 - t_gen_subx_carry(dc, cpu_T[0]); 846 + t_gen_subx_carry(dc, dst);
787 break; 847 break;
788 case CC_OP_LZ: 848 case CC_OP_LZ:
789 - t_gen_lz_i32(cpu_T[0], cpu_T[1]); 849 + t_gen_lz_i32(dst, b);
790 break; 850 break;
791 case CC_OP_BTST: 851 case CC_OP_BTST:
792 - t_gen_btst(cpu_T[0], cpu_T[1]);  
793 - writeback = 0; 852 + t_gen_btst(dst, a, b);
794 break; 853 break;
795 case CC_OP_MULS: 854 case CC_OP_MULS:
796 - {  
797 - TCGv mof;  
798 - mof = tcg_temp_new(TCG_TYPE_TL);  
799 - t_gen_muls(cpu_T[0], mof, cpu_T[0], cpu_T[1]);  
800 - t_gen_mov_preg_TN(dc, PR_MOF, mof);  
801 - tcg_gen_discard_tl(mof);  
802 - }  
803 - break; 855 + t_gen_muls(dst, cpu_PR[PR_MOF], a, b);
  856 + break;
804 case CC_OP_MULU: 857 case CC_OP_MULU:
805 - {  
806 - TCGv mof;  
807 - mof = tcg_temp_new(TCG_TYPE_TL);  
808 - t_gen_mulu(cpu_T[0], mof, cpu_T[0], cpu_T[1]);  
809 - t_gen_mov_preg_TN(dc, PR_MOF, mof);  
810 - tcg_gen_discard_tl(mof);  
811 - }  
812 - break; 858 + t_gen_mulu(dst, cpu_PR[PR_MOF], a, b);
  859 + break;
813 case CC_OP_DSTEP: 860 case CC_OP_DSTEP:
814 - t_gen_cris_dstep(cpu_T[0], cpu_T[1]); 861 + t_gen_cris_dstep(dst, a, b);
815 break; 862 break;
816 case CC_OP_BOUND: 863 case CC_OP_BOUND:
817 { 864 {
818 int l1; 865 int l1;
819 l1 = gen_new_label(); 866 l1 = gen_new_label();
820 - tcg_gen_brcond_tl(TCG_COND_LEU,  
821 - cpu_T[0], cpu_T[1], l1);  
822 - tcg_gen_mov_tl(cpu_T[0], cpu_T[1]); 867 + tcg_gen_mov_tl(dst, a);
  868 + tcg_gen_brcond_tl(TCG_COND_LEU, a, b, l1);
  869 + tcg_gen_mov_tl(dst, b);
823 gen_set_label(l1); 870 gen_set_label(l1);
824 } 871 }
825 break; 872 break;
826 case CC_OP_CMP: 873 case CC_OP_CMP:
827 - tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);  
828 - /* CRIS flag evaluation needs ~src. */  
829 - tcg_gen_not_tl(cpu_T[1], cpu_T[1]);  
830 - 874 + tcg_gen_sub_tl(dst, a, b);
831 /* Extended arithmetics. */ 875 /* Extended arithmetics. */
832 - t_gen_subx_carry(dc, cpu_T[0]);  
833 - writeback = 0; 876 + t_gen_subx_carry(dc, dst);
834 break; 877 break;
835 default: 878 default:
836 fprintf (logfile, "illegal ALU op.\n"); 879 fprintf (logfile, "illegal ALU op.\n");
@@ -838,40 +881,58 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) @@ -838,40 +881,58 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size)
838 break; 881 break;
839 } 882 }
840 883
841 - if (dc->update_cc)  
842 - tcg_gen_mov_tl(cc_src, cpu_T[1]);  
843 -  
844 if (size == 1) 884 if (size == 1)
845 - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xff); 885 + tcg_gen_andi_tl(dst, dst, 0xff);
846 else if (size == 2) 886 else if (size == 2)
847 - tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xffff); 887 + tcg_gen_andi_tl(dst, dst, 0xffff);
  888 +}
  889 +
  890 +static void cris_alu(DisasContext *dc, int op,
  891 + TCGv d, TCGv op_a, TCGv op_b, int size)
  892 +{
  893 + TCGv tmp;
  894 + int writeback;
  895 +
  896 + writeback = 1;
  897 + tmp = cpu_T[0];
  898 + if (op == CC_OP_CMP)
  899 + writeback = 0;
  900 + else if (size == 4) {
  901 + tmp = d;
  902 + writeback = 0;
  903 + }
  904 +
  905 + cris_pre_alu_update_cc(dc, op, op_a, op_b, size);
  906 + cris_alu_op_exec(dc, op, tmp, op_a, op_b, size);
  907 + cris_update_result(dc, tmp);
848 908
849 /* Writeback. */ 909 /* Writeback. */
850 if (writeback) { 910 if (writeback) {
851 - if (size == 4)  
852 - tcg_gen_mov_tl(cpu_R[rd], cpu_T[0]);  
853 - else {  
854 - if (size == 1)  
855 - tcg_gen_andi_tl(cpu_R[rd], cpu_R[rd], ~0xff);  
856 - else  
857 - tcg_gen_andi_tl(cpu_R[rd], cpu_R[rd], ~0xffff);  
858 - tcg_gen_or_tl(cpu_R[rd], cpu_R[rd], cpu_T[0]);  
859 - } 911 + if (size == 1)
  912 + tcg_gen_andi_tl(d, d, ~0xff);
  913 + else
  914 + tcg_gen_andi_tl(d, d, ~0xffff);
  915 + tcg_gen_or_tl(d, d, tmp);
860 } 916 }
861 - if (dc->update_cc)  
862 - tcg_gen_mov_tl(cc_result, cpu_T[0]);  
863 } 917 }
864 918
865 static int arith_cc(DisasContext *dc) 919 static int arith_cc(DisasContext *dc)
866 { 920 {
867 if (dc->update_cc) { 921 if (dc->update_cc) {
868 switch (dc->cc_op) { 922 switch (dc->cc_op) {
  923 + case CC_OP_ADDC: return 1;
869 case CC_OP_ADD: return 1; 924 case CC_OP_ADD: return 1;
870 case CC_OP_SUB: return 1; 925 case CC_OP_SUB: return 1;
  926 + case CC_OP_DSTEP: return 1;
871 case CC_OP_LSL: return 1; 927 case CC_OP_LSL: return 1;
872 case CC_OP_LSR: return 1; 928 case CC_OP_LSR: return 1;
873 case CC_OP_ASR: return 1; 929 case CC_OP_ASR: return 1;
874 case CC_OP_CMP: return 1; 930 case CC_OP_CMP: return 1;
  931 + case CC_OP_NEG: return 1;
  932 + case CC_OP_OR: return 1;
  933 + case CC_OP_XOR: return 1;
  934 + case CC_OP_MULU: return 1;
  935 + case CC_OP_MULS: return 1;
875 default: 936 default:
876 return 0; 937 return 0;
877 } 938 }
@@ -893,7 +954,7 @@ static void gen_tst_cc (DisasContext *dc, int cond) @@ -893,7 +954,7 @@ static void gen_tst_cc (DisasContext *dc, int cond)
893 * When this function is done, T0 should be non-zero if the condition 954 * When this function is done, T0 should be non-zero if the condition
894 * code is true. 955 * code is true.
895 */ 956 */
896 - arith_opt = arith_cc(dc) && !dc->flags_live; 957 + arith_opt = arith_cc(dc) && !dc->flags_uptodate;
897 switch (cond) { 958 switch (cond) {
898 case CC_EQ: 959 case CC_EQ:
899 if (arith_opt) { 960 if (arith_opt) {
@@ -982,7 +1043,7 @@ static void gen_tst_cc (DisasContext *dc, int cond) @@ -982,7 +1043,7 @@ static void gen_tst_cc (DisasContext *dc, int cond)
982 tcg_gen_and_tl(cpu_T[0], tmp, cpu_T[0]); 1043 tcg_gen_and_tl(cpu_T[0], tmp, cpu_T[0]);
983 tcg_gen_andi_tl(cpu_T[0], cpu_T[0], Z_FLAG); 1044 tcg_gen_andi_tl(cpu_T[0], cpu_T[0], Z_FLAG);
984 1045
985 - tcg_gen_discard_tl(tmp); 1046 + tcg_temp_free(tmp);
986 } 1047 }
987 break; 1048 break;
988 case CC_GE: 1049 case CC_GE:
@@ -1022,8 +1083,8 @@ static void gen_tst_cc (DisasContext *dc, int cond) @@ -1022,8 +1083,8 @@ static void gen_tst_cc (DisasContext *dc, int cond)
1022 tcg_gen_and_tl(cpu_T[0], z, n); 1083 tcg_gen_and_tl(cpu_T[0], z, n);
1023 tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 2); 1084 tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 2);
1024 1085
1025 - tcg_gen_discard_tl(n);  
1026 - tcg_gen_discard_tl(z); 1086 + tcg_temp_free(n);
  1087 + tcg_temp_free(z);
1027 } 1088 }
1028 break; 1089 break;
1029 case CC_LE: 1090 case CC_LE:
@@ -1043,8 +1104,8 @@ static void gen_tst_cc (DisasContext *dc, int cond) @@ -1043,8 +1104,8 @@ static void gen_tst_cc (DisasContext *dc, int cond)
1043 tcg_gen_or_tl(cpu_T[0], z, n); 1104 tcg_gen_or_tl(cpu_T[0], z, n);
1044 tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 2); 1105 tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 2);
1045 1106
1046 - tcg_gen_discard_tl(n);  
1047 - tcg_gen_discard_tl(z); 1107 + tcg_temp_free(n);
  1108 + tcg_temp_free(z);
1048 } 1109 }
1049 break; 1110 break;
1050 case CC_P: 1111 case CC_P:
@@ -1089,7 +1150,6 @@ void gen_load(DisasContext *dc, TCGv dst, TCGv addr, @@ -1089,7 +1150,6 @@ void gen_load(DisasContext *dc, TCGv dst, TCGv addr,
1089 { 1150 {
1090 int mem_index = cpu_mmu_index(dc->env); 1151 int mem_index = cpu_mmu_index(dc->env);
1091 1152
1092 - cris_evaluate_flags(dc);  
1093 if (size == 1) { 1153 if (size == 1) {
1094 if (sign) 1154 if (sign)
1095 tcg_gen_qemu_ld8s(dst, addr, mem_index); 1155 tcg_gen_qemu_ld8s(dst, addr, mem_index);
@@ -1103,7 +1163,7 @@ void gen_load(DisasContext *dc, TCGv dst, TCGv addr, @@ -1103,7 +1163,7 @@ void gen_load(DisasContext *dc, TCGv dst, TCGv addr,
1103 tcg_gen_qemu_ld16u(dst, addr, mem_index); 1163 tcg_gen_qemu_ld16u(dst, addr, mem_index);
1104 } 1164 }
1105 else { 1165 else {
1106 - tcg_gen_qemu_ld32s(dst, addr, mem_index); 1166 + tcg_gen_qemu_ld32u(dst, addr, mem_index);
1107 } 1167 }
1108 } 1168 }
1109 1169
@@ -1112,8 +1172,6 @@ void gen_store (DisasContext *dc, TCGv addr, TCGv val, @@ -1112,8 +1172,6 @@ void gen_store (DisasContext *dc, TCGv addr, TCGv val,
1112 { 1172 {
1113 int mem_index = cpu_mmu_index(dc->env); 1173 int mem_index = cpu_mmu_index(dc->env);
1114 1174
1115 - cris_evaluate_flags(dc);  
1116 -  
1117 /* Remember, operands are flipped. CRIS has reversed order. */ 1175 /* Remember, operands are flipped. CRIS has reversed order. */
1118 if (size == 1) 1176 if (size == 1)
1119 tcg_gen_qemu_st8(val, addr, mem_index); 1177 tcg_gen_qemu_st8(val, addr, mem_index);
@@ -1129,7 +1187,7 @@ static inline void t_gen_sext(TCGv d, TCGv s, int size) @@ -1129,7 +1187,7 @@ static inline void t_gen_sext(TCGv d, TCGv s, int size)
1129 tcg_gen_ext8s_i32(d, s); 1187 tcg_gen_ext8s_i32(d, s);
1130 else if (size == 2) 1188 else if (size == 2)
1131 tcg_gen_ext16s_i32(d, s); 1189 tcg_gen_ext16s_i32(d, s);
1132 - else 1190 + else if(d != s)
1133 tcg_gen_mov_tl(d, s); 1191 tcg_gen_mov_tl(d, s);
1134 } 1192 }
1135 1193
@@ -1139,7 +1197,7 @@ static inline void t_gen_zext(TCGv d, TCGv s, int size) @@ -1139,7 +1197,7 @@ static inline void t_gen_zext(TCGv d, TCGv s, int size)
1139 tcg_gen_ext8u_i32(d, s); 1197 tcg_gen_ext8u_i32(d, s);
1140 else if (size == 2) 1198 else if (size == 2)
1141 tcg_gen_ext16u_i32(d, s); 1199 tcg_gen_ext16u_i32(d, s);
1142 - else 1200 + else if (d != s)
1143 tcg_gen_mov_tl(d, s); 1201 tcg_gen_mov_tl(d, s);
1144 } 1202 }
1145 1203
@@ -1158,12 +1216,12 @@ static char memsize_char(int size) @@ -1158,12 +1216,12 @@ static char memsize_char(int size)
1158 } 1216 }
1159 #endif 1217 #endif
1160 1218
1161 -static unsigned int memsize_z(DisasContext *dc) 1219 +static inline unsigned int memsize_z(DisasContext *dc)
1162 { 1220 {
1163 return dc->zsize + 1; 1221 return dc->zsize + 1;
1164 } 1222 }
1165 1223
1166 -static unsigned int memsize_zz(DisasContext *dc) 1224 +static inline unsigned int memsize_zz(DisasContext *dc)
1167 { 1225 {
1168 switch (dc->zzsize) 1226 switch (dc->zzsize)
1169 { 1227 {
@@ -1180,13 +1238,13 @@ static inline void do_postinc (DisasContext *dc, int size) @@ -1180,13 +1238,13 @@ static inline void do_postinc (DisasContext *dc, int size)
1180 tcg_gen_addi_tl(cpu_R[dc->op1], cpu_R[dc->op1], size); 1238 tcg_gen_addi_tl(cpu_R[dc->op1], cpu_R[dc->op1], size);
1181 } 1239 }
1182 1240
1183 -static void dec_prep_move_r(DisasContext *dc, int rs, int rd,  
1184 - int size, int s_ext) 1241 +static inline void dec_prep_move_r(DisasContext *dc, int rs, int rd,
  1242 + int size, int s_ext, TCGv dst)
1185 { 1243 {
1186 if (s_ext) 1244 if (s_ext)
1187 - t_gen_sext(cpu_T[1], cpu_R[rs], size); 1245 + t_gen_sext(dst, cpu_R[rs], size);
1188 else 1246 else
1189 - t_gen_zext(cpu_T[1], cpu_R[rs], size); 1247 + t_gen_zext(dst, cpu_R[rs], size);
1190 } 1248 }
1191 1249
1192 /* Prepare T0 and T1 for a register alu operation. 1250 /* Prepare T0 and T1 for a register alu operation.
@@ -1195,7 +1253,7 @@ static void dec_prep_move_r(DisasContext *dc, int rs, int rd, @@ -1195,7 +1253,7 @@ static void dec_prep_move_r(DisasContext *dc, int rs, int rd,
1195 static void dec_prep_alu_r(DisasContext *dc, int rs, int rd, 1253 static void dec_prep_alu_r(DisasContext *dc, int rs, int rd,
1196 int size, int s_ext) 1254 int size, int s_ext)
1197 { 1255 {
1198 - dec_prep_move_r(dc, rs, rd, size, s_ext); 1256 + dec_prep_move_r(dc, rs, rd, size, s_ext, cpu_T[1]);
1199 1257
1200 if (s_ext) 1258 if (s_ext)
1201 t_gen_sext(cpu_T[0], cpu_R[rd], size); 1259 t_gen_sext(cpu_T[0], cpu_R[rd], size);
@@ -1203,7 +1261,8 @@ static void dec_prep_alu_r(DisasContext *dc, int rs, int rd, @@ -1203,7 +1261,8 @@ static void dec_prep_alu_r(DisasContext *dc, int rs, int rd,
1203 t_gen_zext(cpu_T[0], cpu_R[rd], size); 1261 t_gen_zext(cpu_T[0], cpu_R[rd], size);
1204 } 1262 }
1205 1263
1206 -static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize) 1264 +static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize,
  1265 + TCGv dst)
1207 { 1266 {
1208 unsigned int rs, rd; 1267 unsigned int rs, rd;
1209 uint32_t imm; 1268 uint32_t imm;
@@ -1237,14 +1296,15 @@ static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize) @@ -1237,14 +1296,15 @@ static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize)
1237 1296
1238 DIS(fprintf (logfile, "imm=%x rd=%d sext=%d ms=%d\n", 1297 DIS(fprintf (logfile, "imm=%x rd=%d sext=%d ms=%d\n",
1239 imm, rd, s_ext, memsize)); 1298 imm, rd, s_ext, memsize));
1240 - tcg_gen_movi_tl(cpu_T[1], imm); 1299 + tcg_gen_movi_tl(dst, imm);
1241 dc->postinc = 0; 1300 dc->postinc = 0;
1242 } else { 1301 } else {
1243 - gen_load(dc, cpu_T[1], cpu_R[rs], memsize, 0); 1302 + cris_flush_cc_state(dc);
  1303 + gen_load(dc, dst, cpu_R[rs], memsize, 0);
1244 if (s_ext) 1304 if (s_ext)
1245 - t_gen_sext(cpu_T[1], cpu_T[1], memsize); 1305 + t_gen_sext(dst, dst, memsize);
1246 else 1306 else
1247 - t_gen_zext(cpu_T[1], cpu_T[1], memsize); 1307 + t_gen_zext(dst, dst, memsize);
1248 } 1308 }
1249 return insn_len; 1309 return insn_len;
1250 } 1310 }
@@ -1256,7 +1316,7 @@ static int dec_prep_alu_m(DisasContext *dc, int s_ext, int memsize) @@ -1256,7 +1316,7 @@ static int dec_prep_alu_m(DisasContext *dc, int s_ext, int memsize)
1256 { 1316 {
1257 int insn_len; 1317 int insn_len;
1258 1318
1259 - insn_len = dec_prep_move_m(dc, s_ext, memsize); 1319 + insn_len = dec_prep_move_m(dc, s_ext, memsize, cpu_T[1]);
1260 1320
1261 /* put dest in T0. */ 1321 /* put dest in T0. */
1262 tcg_gen_mov_tl(cpu_T[0], cpu_R[dc->op2]); 1322 tcg_gen_mov_tl(cpu_T[0], cpu_R[dc->op2]);
@@ -1317,10 +1377,9 @@ static unsigned int dec_addq(DisasContext *dc) @@ -1317,10 +1377,9 @@ static unsigned int dec_addq(DisasContext *dc)
1317 dc->op1 = EXTRACT_FIELD(dc->ir, 0, 5); 1377 dc->op1 = EXTRACT_FIELD(dc->ir, 0, 5);
1318 1378
1319 cris_cc_mask(dc, CC_MASK_NZVC); 1379 cris_cc_mask(dc, CC_MASK_NZVC);
1320 - /* Fetch register operand, */  
1321 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1322 - tcg_gen_movi_tl(cpu_T[1], dc->op1);  
1323 - crisv32_alu_op(dc, CC_OP_ADD, dc->op2, 4); 1380 +
  1381 + cris_alu(dc, CC_OP_ADD,
  1382 + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(dc->op1), 4);
1324 return 2; 1383 return 2;
1325 } 1384 }
1326 static unsigned int dec_moveq(DisasContext *dc) 1385 static unsigned int dec_moveq(DisasContext *dc)
@@ -1341,10 +1400,8 @@ static unsigned int dec_subq(DisasContext *dc) @@ -1341,10 +1400,8 @@ static unsigned int dec_subq(DisasContext *dc)
1341 DIS(fprintf (logfile, "subq %u, $r%u\n", dc->op1, dc->op2)); 1400 DIS(fprintf (logfile, "subq %u, $r%u\n", dc->op1, dc->op2));
1342 1401
1343 cris_cc_mask(dc, CC_MASK_NZVC); 1402 cris_cc_mask(dc, CC_MASK_NZVC);
1344 - /* Fetch register operand, */  
1345 - tcg_gen_mov_tl(cpu_T[0], cpu_R[dc->op2]);  
1346 - tcg_gen_movi_tl(cpu_T[1], dc->op1);  
1347 - crisv32_alu_op(dc, CC_OP_SUB, dc->op2, 4); 1403 + cris_alu(dc, CC_OP_SUB,
  1404 + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(dc->op1), 4);
1348 return 2; 1405 return 2;
1349 } 1406 }
1350 static unsigned int dec_cmpq(DisasContext *dc) 1407 static unsigned int dec_cmpq(DisasContext *dc)
@@ -1355,9 +1412,9 @@ static unsigned int dec_cmpq(DisasContext *dc) @@ -1355,9 +1412,9 @@ static unsigned int dec_cmpq(DisasContext *dc)
1355 1412
1356 DIS(fprintf (logfile, "cmpq %d, $r%d\n", imm, dc->op2)); 1413 DIS(fprintf (logfile, "cmpq %d, $r%d\n", imm, dc->op2));
1357 cris_cc_mask(dc, CC_MASK_NZVC); 1414 cris_cc_mask(dc, CC_MASK_NZVC);
1358 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1359 - tcg_gen_movi_tl(cpu_T[1], imm);  
1360 - crisv32_alu_op(dc, CC_OP_CMP, dc->op2, 4); 1415 +
  1416 + cris_alu(dc, CC_OP_CMP,
  1417 + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(imm), 4);
1361 return 2; 1418 return 2;
1362 } 1419 }
1363 static unsigned int dec_andq(DisasContext *dc) 1420 static unsigned int dec_andq(DisasContext *dc)
@@ -1368,9 +1425,9 @@ static unsigned int dec_andq(DisasContext *dc) @@ -1368,9 +1425,9 @@ static unsigned int dec_andq(DisasContext *dc)
1368 1425
1369 DIS(fprintf (logfile, "andq %d, $r%d\n", imm, dc->op2)); 1426 DIS(fprintf (logfile, "andq %d, $r%d\n", imm, dc->op2));
1370 cris_cc_mask(dc, CC_MASK_NZ); 1427 cris_cc_mask(dc, CC_MASK_NZ);
1371 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1372 - tcg_gen_movi_tl(cpu_T[1], imm);  
1373 - crisv32_alu_op(dc, CC_OP_AND, dc->op2, 4); 1428 +
  1429 + cris_alu(dc, CC_OP_AND,
  1430 + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(imm), 4);
1374 return 2; 1431 return 2;
1375 } 1432 }
1376 static unsigned int dec_orq(DisasContext *dc) 1433 static unsigned int dec_orq(DisasContext *dc)
@@ -1380,9 +1437,9 @@ static unsigned int dec_orq(DisasContext *dc) @@ -1380,9 +1437,9 @@ static unsigned int dec_orq(DisasContext *dc)
1380 imm = sign_extend(dc->op1, 5); 1437 imm = sign_extend(dc->op1, 5);
1381 DIS(fprintf (logfile, "orq %d, $r%d\n", imm, dc->op2)); 1438 DIS(fprintf (logfile, "orq %d, $r%d\n", imm, dc->op2));
1382 cris_cc_mask(dc, CC_MASK_NZ); 1439 cris_cc_mask(dc, CC_MASK_NZ);
1383 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1384 - tcg_gen_movi_tl(cpu_T[1], imm);  
1385 - crisv32_alu_op(dc, CC_OP_OR, dc->op2, 4); 1440 +
  1441 + cris_alu(dc, CC_OP_OR,
  1442 + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(imm), 4);
1386 return 2; 1443 return 2;
1387 } 1444 }
1388 static unsigned int dec_btstq(DisasContext *dc) 1445 static unsigned int dec_btstq(DisasContext *dc)
@@ -1391,13 +1448,13 @@ static unsigned int dec_btstq(DisasContext *dc) @@ -1391,13 +1448,13 @@ static unsigned int dec_btstq(DisasContext *dc)
1391 DIS(fprintf (logfile, "btstq %u, $r%d\n", dc->op1, dc->op2)); 1448 DIS(fprintf (logfile, "btstq %u, $r%d\n", dc->op1, dc->op2));
1392 1449
1393 cris_cc_mask(dc, CC_MASK_NZ); 1450 cris_cc_mask(dc, CC_MASK_NZ);
1394 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1395 - tcg_gen_movi_tl(cpu_T[1], dc->op1);  
1396 - crisv32_alu_op(dc, CC_OP_BTST, dc->op2, 4);  
1397 1451
  1452 + t_gen_mov_TN_reg(cpu_T[0], dc->op2);
  1453 + cris_alu(dc, CC_OP_BTST,
  1454 + cpu_T[0], cpu_R[dc->op2], tcg_const_tl(dc->op1), 4);
1398 cris_update_cc_op(dc, CC_OP_FLAGS, 4); 1455 cris_update_cc_op(dc, CC_OP_FLAGS, 4);
1399 t_gen_mov_preg_TN(dc, PR_CCS, cpu_T[0]); 1456 t_gen_mov_preg_TN(dc, PR_CCS, cpu_T[0]);
1400 - dc->flags_live = 1; 1457 + dc->flags_uptodate = 1;
1401 return 2; 1458 return 2;
1402 } 1459 }
1403 static unsigned int dec_asrq(DisasContext *dc) 1460 static unsigned int dec_asrq(DisasContext *dc)
@@ -1405,9 +1462,10 @@ static unsigned int dec_asrq(DisasContext *dc) @@ -1405,9 +1462,10 @@ static unsigned int dec_asrq(DisasContext *dc)
1405 dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4); 1462 dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4);
1406 DIS(fprintf (logfile, "asrq %u, $r%d\n", dc->op1, dc->op2)); 1463 DIS(fprintf (logfile, "asrq %u, $r%d\n", dc->op1, dc->op2));
1407 cris_cc_mask(dc, CC_MASK_NZ); 1464 cris_cc_mask(dc, CC_MASK_NZ);
1408 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1409 - tcg_gen_movi_tl(cpu_T[1], dc->op1);  
1410 - crisv32_alu_op(dc, CC_OP_ASR, dc->op2, 4); 1465 +
  1466 + cris_alu(dc, CC_OP_ASR,
  1467 + cpu_R[dc->op2],
  1468 + cpu_R[dc->op2], tcg_const_tl(dc->op1), 4);
1411 return 2; 1469 return 2;
1412 } 1470 }
1413 static unsigned int dec_lslq(DisasContext *dc) 1471 static unsigned int dec_lslq(DisasContext *dc)
@@ -1416,9 +1474,10 @@ static unsigned int dec_lslq(DisasContext *dc) @@ -1416,9 +1474,10 @@ static unsigned int dec_lslq(DisasContext *dc)
1416 DIS(fprintf (logfile, "lslq %u, $r%d\n", dc->op1, dc->op2)); 1474 DIS(fprintf (logfile, "lslq %u, $r%d\n", dc->op1, dc->op2));
1417 1475
1418 cris_cc_mask(dc, CC_MASK_NZ); 1476 cris_cc_mask(dc, CC_MASK_NZ);
1419 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1420 - tcg_gen_movi_tl(cpu_T[1], dc->op1);  
1421 - crisv32_alu_op(dc, CC_OP_LSL, dc->op2, 4); 1477 +
  1478 + cris_alu(dc, CC_OP_LSL,
  1479 + cpu_R[dc->op2],
  1480 + cpu_R[dc->op2], tcg_const_tl(dc->op1), 4);
1422 return 2; 1481 return 2;
1423 } 1482 }
1424 static unsigned int dec_lsrq(DisasContext *dc) 1483 static unsigned int dec_lsrq(DisasContext *dc)
@@ -1427,9 +1486,10 @@ static unsigned int dec_lsrq(DisasContext *dc) @@ -1427,9 +1486,10 @@ static unsigned int dec_lsrq(DisasContext *dc)
1427 DIS(fprintf (logfile, "lsrq %u, $r%d\n", dc->op1, dc->op2)); 1486 DIS(fprintf (logfile, "lsrq %u, $r%d\n", dc->op1, dc->op2));
1428 1487
1429 cris_cc_mask(dc, CC_MASK_NZ); 1488 cris_cc_mask(dc, CC_MASK_NZ);
1430 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1431 - tcg_gen_movi_tl(cpu_T[1], dc->op1);  
1432 - crisv32_alu_op(dc, CC_OP_LSR, dc->op2, 4); 1489 +
  1490 + cris_alu(dc, CC_OP_LSR,
  1491 + cpu_R[dc->op2],
  1492 + cpu_R[dc->op2], tcg_const_tl(dc->op1), 4);
1433 return 2; 1493 return 2;
1434 } 1494 }
1435 1495
@@ -1441,8 +1501,19 @@ static unsigned int dec_move_r(DisasContext *dc) @@ -1441,8 +1501,19 @@ static unsigned int dec_move_r(DisasContext *dc)
1441 memsize_char(size), dc->op1, dc->op2)); 1501 memsize_char(size), dc->op1, dc->op2));
1442 1502
1443 cris_cc_mask(dc, CC_MASK_NZ); 1503 cris_cc_mask(dc, CC_MASK_NZ);
1444 - dec_prep_move_r(dc, dc->op1, dc->op2, size, 0);  
1445 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, size); 1504 + if (size == 4) {
  1505 + dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, cpu_R[dc->op2]);
  1506 + cris_cc_mask(dc, CC_MASK_NZ);
  1507 + cris_update_cc_op(dc, CC_OP_MOVE, 4);
  1508 + cris_update_cc_x(dc);
  1509 + cris_update_result(dc, cpu_R[dc->op2]);
  1510 + }
  1511 + else {
  1512 + dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, cpu_T[1]);
  1513 + cris_alu(dc, CC_OP_MOVE,
  1514 + cpu_R[dc->op2],
  1515 + cpu_R[dc->op2], cpu_T[1], size);
  1516 + }
1446 return 2; 1517 return 2;
1447 } 1518 }
1448 1519
@@ -1480,7 +1551,10 @@ static unsigned int dec_and_r(DisasContext *dc) @@ -1480,7 +1551,10 @@ static unsigned int dec_and_r(DisasContext *dc)
1480 memsize_char(size), dc->op1, dc->op2)); 1551 memsize_char(size), dc->op1, dc->op2));
1481 cris_cc_mask(dc, CC_MASK_NZ); 1552 cris_cc_mask(dc, CC_MASK_NZ);
1482 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1553 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1483 - crisv32_alu_op(dc, CC_OP_AND, dc->op2, size); 1554 +
  1555 + cris_alu(dc, CC_OP_AND,
  1556 + cpu_R[dc->op2],
  1557 + cpu_R[dc->op2], cpu_T[1], size);
1484 return 2; 1558 return 2;
1485 } 1559 }
1486 1560
@@ -1490,7 +1564,8 @@ static unsigned int dec_lz_r(DisasContext *dc) @@ -1490,7 +1564,8 @@ static unsigned int dec_lz_r(DisasContext *dc)
1490 dc->op1, dc->op2)); 1564 dc->op1, dc->op2));
1491 cris_cc_mask(dc, CC_MASK_NZ); 1565 cris_cc_mask(dc, CC_MASK_NZ);
1492 dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0); 1566 dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0);
1493 - crisv32_alu_op(dc, CC_OP_LZ, dc->op2, 4); 1567 + cris_alu(dc, CC_OP_LZ,
  1568 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
1494 return 2; 1569 return 2;
1495 } 1570 }
1496 1571
@@ -1503,7 +1578,9 @@ static unsigned int dec_lsl_r(DisasContext *dc) @@ -1503,7 +1578,9 @@ static unsigned int dec_lsl_r(DisasContext *dc)
1503 cris_cc_mask(dc, CC_MASK_NZ); 1578 cris_cc_mask(dc, CC_MASK_NZ);
1504 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1579 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1505 tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 63); 1580 tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 63);
1506 - crisv32_alu_op(dc, CC_OP_LSL, dc->op2, size); 1581 +
  1582 + cris_alu(dc, CC_OP_LSL,
  1583 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], size);
1507 return 2; 1584 return 2;
1508 } 1585 }
1509 1586
@@ -1516,7 +1593,9 @@ static unsigned int dec_lsr_r(DisasContext *dc) @@ -1516,7 +1593,9 @@ static unsigned int dec_lsr_r(DisasContext *dc)
1516 cris_cc_mask(dc, CC_MASK_NZ); 1593 cris_cc_mask(dc, CC_MASK_NZ);
1517 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1594 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1518 tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 63); 1595 tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 63);
1519 - crisv32_alu_op(dc, CC_OP_LSR, dc->op2, size); 1596 +
  1597 + cris_alu(dc, CC_OP_LSR,
  1598 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], size);
1520 return 2; 1599 return 2;
1521 } 1600 }
1522 1601
@@ -1529,7 +1608,9 @@ static unsigned int dec_asr_r(DisasContext *dc) @@ -1529,7 +1608,9 @@ static unsigned int dec_asr_r(DisasContext *dc)
1529 cris_cc_mask(dc, CC_MASK_NZ); 1608 cris_cc_mask(dc, CC_MASK_NZ);
1530 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 1); 1609 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 1);
1531 tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 63); 1610 tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 63);
1532 - crisv32_alu_op(dc, CC_OP_ASR, dc->op2, size); 1611 +
  1612 + cris_alu(dc, CC_OP_ASR,
  1613 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], size);
1533 return 2; 1614 return 2;
1534 } 1615 }
1535 1616
@@ -1541,8 +1622,9 @@ static unsigned int dec_muls_r(DisasContext *dc) @@ -1541,8 +1622,9 @@ static unsigned int dec_muls_r(DisasContext *dc)
1541 memsize_char(size), dc->op1, dc->op2)); 1622 memsize_char(size), dc->op1, dc->op2));
1542 cris_cc_mask(dc, CC_MASK_NZV); 1623 cris_cc_mask(dc, CC_MASK_NZV);
1543 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 1); 1624 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 1);
1544 - t_gen_sext(cpu_T[0], cpu_T[0], size);  
1545 - crisv32_alu_op(dc, CC_OP_MULS, dc->op2, 4); 1625 +
  1626 + cris_alu(dc, CC_OP_MULS,
  1627 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
1546 return 2; 1628 return 2;
1547 } 1629 }
1548 1630
@@ -1554,8 +1636,9 @@ static unsigned int dec_mulu_r(DisasContext *dc) @@ -1554,8 +1636,9 @@ static unsigned int dec_mulu_r(DisasContext *dc)
1554 memsize_char(size), dc->op1, dc->op2)); 1636 memsize_char(size), dc->op1, dc->op2));
1555 cris_cc_mask(dc, CC_MASK_NZV); 1637 cris_cc_mask(dc, CC_MASK_NZV);
1556 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1638 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1557 - t_gen_zext(cpu_T[0], cpu_T[0], size);  
1558 - crisv32_alu_op(dc, CC_OP_MULU, dc->op2, 4); 1639 +
  1640 + cris_alu(dc, CC_OP_MULU,
  1641 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
1559 return 2; 1642 return 2;
1560 } 1643 }
1561 1644
@@ -1564,9 +1647,8 @@ static unsigned int dec_dstep_r(DisasContext *dc) @@ -1564,9 +1647,8 @@ static unsigned int dec_dstep_r(DisasContext *dc)
1564 { 1647 {
1565 DIS(fprintf (logfile, "dstep $r%u, $r%u\n", dc->op1, dc->op2)); 1648 DIS(fprintf (logfile, "dstep $r%u, $r%u\n", dc->op1, dc->op2));
1566 cris_cc_mask(dc, CC_MASK_NZ); 1649 cris_cc_mask(dc, CC_MASK_NZ);
1567 - t_gen_mov_TN_reg(cpu_T[1], dc->op1);  
1568 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1569 - crisv32_alu_op(dc, CC_OP_DSTEP, dc->op2, 4); 1650 + cris_alu(dc, CC_OP_DSTEP,
  1651 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_R[dc->op1], 4);
1570 return 2; 1652 return 2;
1571 } 1653 }
1572 1654
@@ -1578,7 +1660,9 @@ static unsigned int dec_xor_r(DisasContext *dc) @@ -1578,7 +1660,9 @@ static unsigned int dec_xor_r(DisasContext *dc)
1578 BUG_ON(size != 4); /* xor is dword. */ 1660 BUG_ON(size != 4); /* xor is dword. */
1579 cris_cc_mask(dc, CC_MASK_NZ); 1661 cris_cc_mask(dc, CC_MASK_NZ);
1580 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1662 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1581 - crisv32_alu_op(dc, CC_OP_XOR, dc->op2, 4); 1663 +
  1664 + cris_alu(dc, CC_OP_XOR,
  1665 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
1582 return 2; 1666 return 2;
1583 } 1667 }
1584 1668
@@ -1588,11 +1672,9 @@ static unsigned int dec_bound_r(DisasContext *dc) @@ -1588,11 +1672,9 @@ static unsigned int dec_bound_r(DisasContext *dc)
1588 DIS(fprintf (logfile, "bound.%c $r%u, $r%u\n", 1672 DIS(fprintf (logfile, "bound.%c $r%u, $r%u\n",
1589 memsize_char(size), dc->op1, dc->op2)); 1673 memsize_char(size), dc->op1, dc->op2));
1590 cris_cc_mask(dc, CC_MASK_NZ); 1674 cris_cc_mask(dc, CC_MASK_NZ);
1591 - /* TODO: needs optmimization. */  
1592 - dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);  
1593 - /* rd should be 4. */  
1594 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1595 - crisv32_alu_op(dc, CC_OP_BOUND, dc->op2, 4); 1675 + dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, cpu_T[1]);
  1676 + cris_alu(dc, CC_OP_BOUND,
  1677 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
1596 return 2; 1678 return 2;
1597 } 1679 }
1598 1680
@@ -1603,7 +1685,9 @@ static unsigned int dec_cmp_r(DisasContext *dc) @@ -1603,7 +1685,9 @@ static unsigned int dec_cmp_r(DisasContext *dc)
1603 memsize_char(size), dc->op1, dc->op2)); 1685 memsize_char(size), dc->op1, dc->op2));
1604 cris_cc_mask(dc, CC_MASK_NZVC); 1686 cris_cc_mask(dc, CC_MASK_NZVC);
1605 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1687 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1606 - crisv32_alu_op(dc, CC_OP_CMP, dc->op2, size); 1688 +
  1689 + cris_alu(dc, CC_OP_CMP,
  1690 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], size);
1607 return 2; 1691 return 2;
1608 } 1692 }
1609 1693
@@ -1614,14 +1698,15 @@ static unsigned int dec_abs_r(DisasContext *dc) @@ -1614,14 +1698,15 @@ static unsigned int dec_abs_r(DisasContext *dc)
1614 DIS(fprintf (logfile, "abs $r%u, $r%u\n", 1698 DIS(fprintf (logfile, "abs $r%u, $r%u\n",
1615 dc->op1, dc->op2)); 1699 dc->op1, dc->op2));
1616 cris_cc_mask(dc, CC_MASK_NZ); 1700 cris_cc_mask(dc, CC_MASK_NZ);
1617 - dec_prep_move_r(dc, dc->op1, dc->op2, 4, 0); 1701 + dec_prep_move_r(dc, dc->op1, dc->op2, 4, 0, cpu_T[1]);
1618 1702
1619 /* TODO: consider a branch free approach. */ 1703 /* TODO: consider a branch free approach. */
1620 l1 = gen_new_label(); 1704 l1 = gen_new_label();
1621 tcg_gen_brcondi_tl(TCG_COND_GE, cpu_T[1], 0, l1); 1705 tcg_gen_brcondi_tl(TCG_COND_GE, cpu_T[1], 0, l1);
1622 tcg_gen_neg_tl(cpu_T[1], cpu_T[1]); 1706 tcg_gen_neg_tl(cpu_T[1], cpu_T[1]);
1623 gen_set_label(l1); 1707 gen_set_label(l1);
1624 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); 1708 + cris_alu(dc, CC_OP_MOVE,
  1709 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
1625 return 2; 1710 return 2;
1626 } 1711 }
1627 1712
@@ -1632,7 +1717,9 @@ static unsigned int dec_add_r(DisasContext *dc) @@ -1632,7 +1717,9 @@ static unsigned int dec_add_r(DisasContext *dc)
1632 memsize_char(size), dc->op1, dc->op2)); 1717 memsize_char(size), dc->op1, dc->op2));
1633 cris_cc_mask(dc, CC_MASK_NZVC); 1718 cris_cc_mask(dc, CC_MASK_NZVC);
1634 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1719 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1635 - crisv32_alu_op(dc, CC_OP_ADD, dc->op2, size); 1720 +
  1721 + cris_alu(dc, CC_OP_ADD,
  1722 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], size);
1636 return 2; 1723 return 2;
1637 } 1724 }
1638 1725
@@ -1643,7 +1730,8 @@ static unsigned int dec_addc_r(DisasContext *dc) @@ -1643,7 +1730,8 @@ static unsigned int dec_addc_r(DisasContext *dc)
1643 cris_evaluate_flags(dc); 1730 cris_evaluate_flags(dc);
1644 cris_cc_mask(dc, CC_MASK_NZVC); 1731 cris_cc_mask(dc, CC_MASK_NZVC);
1645 dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0); 1732 dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0);
1646 - crisv32_alu_op(dc, CC_OP_ADDC, dc->op2, 4); 1733 + cris_alu(dc, CC_OP_ADDC,
  1734 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
1647 return 2; 1735 return 2;
1648 } 1736 }
1649 1737
@@ -1653,9 +1741,8 @@ static unsigned int dec_mcp_r(DisasContext *dc) @@ -1653,9 +1741,8 @@ static unsigned int dec_mcp_r(DisasContext *dc)
1653 dc->op2, dc->op1)); 1741 dc->op2, dc->op1));
1654 cris_evaluate_flags(dc); 1742 cris_evaluate_flags(dc);
1655 cris_cc_mask(dc, CC_MASK_RNZV); 1743 cris_cc_mask(dc, CC_MASK_RNZV);
1656 - t_gen_mov_TN_reg(cpu_T[0], dc->op1);  
1657 - t_gen_mov_TN_preg(cpu_T[1], dc->op2);  
1658 - crisv32_alu_op(dc, CC_OP_MCP, dc->op1, 4); 1744 + cris_alu(dc, CC_OP_MCP,
  1745 + cpu_R[dc->op1], cpu_R[dc->op1], cpu_PR[dc->op2], 4);
1659 return 2; 1746 return 2;
1660 } 1747 }
1661 1748
@@ -1693,8 +1780,9 @@ static unsigned int dec_swap_r(DisasContext *dc) @@ -1693,8 +1780,9 @@ static unsigned int dec_swap_r(DisasContext *dc)
1693 t_gen_swapb(cpu_T[0], cpu_T[0]); 1780 t_gen_swapb(cpu_T[0], cpu_T[0]);
1694 if (dc->op2 & 1) 1781 if (dc->op2 & 1)
1695 t_gen_swapr(cpu_T[0], cpu_T[0]); 1782 t_gen_swapr(cpu_T[0], cpu_T[0]);
1696 - tcg_gen_mov_tl(cpu_T[1], cpu_T[0]);  
1697 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op1, 4); 1783 + cris_alu(dc, CC_OP_MOVE,
  1784 + cpu_R[dc->op1], cpu_R[dc->op1], cpu_T[0], 4);
  1785 +
1698 return 2; 1786 return 2;
1699 } 1787 }
1700 1788
@@ -1705,7 +1793,9 @@ static unsigned int dec_or_r(DisasContext *dc) @@ -1705,7 +1793,9 @@ static unsigned int dec_or_r(DisasContext *dc)
1705 memsize_char(size), dc->op1, dc->op2)); 1793 memsize_char(size), dc->op1, dc->op2));
1706 cris_cc_mask(dc, CC_MASK_NZ); 1794 cris_cc_mask(dc, CC_MASK_NZ);
1707 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1795 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1708 - crisv32_alu_op(dc, CC_OP_OR, dc->op2, size); 1796 +
  1797 + cris_alu(dc, CC_OP_OR,
  1798 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], size);
1709 return 2; 1799 return 2;
1710 } 1800 }
1711 1801
@@ -1714,10 +1804,8 @@ static unsigned int dec_addi_r(DisasContext *dc) @@ -1714,10 +1804,8 @@ static unsigned int dec_addi_r(DisasContext *dc)
1714 DIS(fprintf (logfile, "addi.%c $r%u, $r%u\n", 1804 DIS(fprintf (logfile, "addi.%c $r%u, $r%u\n",
1715 memsize_char(memsize_zz(dc)), dc->op2, dc->op1)); 1805 memsize_char(memsize_zz(dc)), dc->op2, dc->op1));
1716 cris_cc_mask(dc, 0); 1806 cris_cc_mask(dc, 0);
1717 - dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0);  
1718 - t_gen_lsl(cpu_T[0], cpu_T[0], tcg_const_tl(dc->zzsize));  
1719 - tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);  
1720 - t_gen_mov_reg_TN(dc->op1, cpu_T[0]); 1807 + tcg_gen_shl_tl(cpu_T[0], cpu_R[dc->op2], tcg_const_tl(dc->zzsize));
  1808 + tcg_gen_add_tl(cpu_R[dc->op1], cpu_R[dc->op1], cpu_T[0]);
1721 return 2; 1809 return 2;
1722 } 1810 }
1723 1811
@@ -1726,11 +1814,8 @@ static unsigned int dec_addi_acr(DisasContext *dc) @@ -1726,11 +1814,8 @@ static unsigned int dec_addi_acr(DisasContext *dc)
1726 DIS(fprintf (logfile, "addi.%c $r%u, $r%u, $acr\n", 1814 DIS(fprintf (logfile, "addi.%c $r%u, $r%u, $acr\n",
1727 memsize_char(memsize_zz(dc)), dc->op2, dc->op1)); 1815 memsize_char(memsize_zz(dc)), dc->op2, dc->op1));
1728 cris_cc_mask(dc, 0); 1816 cris_cc_mask(dc, 0);
1729 - dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0);  
1730 - t_gen_lsl(cpu_T[0], cpu_T[0], tcg_const_tl(dc->zzsize));  
1731 -  
1732 - tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);  
1733 - t_gen_mov_reg_TN(R_ACR, cpu_T[0]); 1817 + tcg_gen_shl_tl(cpu_T[0], cpu_R[dc->op2], tcg_const_tl(dc->zzsize));
  1818 + tcg_gen_add_tl(cpu_R[R_ACR], cpu_R[dc->op1], cpu_T[0]);
1734 return 2; 1819 return 2;
1735 } 1820 }
1736 1821
@@ -1741,7 +1826,9 @@ static unsigned int dec_neg_r(DisasContext *dc) @@ -1741,7 +1826,9 @@ static unsigned int dec_neg_r(DisasContext *dc)
1741 memsize_char(size), dc->op1, dc->op2)); 1826 memsize_char(size), dc->op1, dc->op2));
1742 cris_cc_mask(dc, CC_MASK_NZVC); 1827 cris_cc_mask(dc, CC_MASK_NZVC);
1743 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1828 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1744 - crisv32_alu_op(dc, CC_OP_NEG, dc->op2, size); 1829 +
  1830 + cris_alu(dc, CC_OP_NEG,
  1831 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], size);
1745 return 2; 1832 return 2;
1746 } 1833 }
1747 1834
@@ -1751,11 +1838,12 @@ static unsigned int dec_btst_r(DisasContext *dc) @@ -1751,11 +1838,12 @@ static unsigned int dec_btst_r(DisasContext *dc)
1751 dc->op1, dc->op2)); 1838 dc->op1, dc->op2));
1752 cris_cc_mask(dc, CC_MASK_NZ); 1839 cris_cc_mask(dc, CC_MASK_NZ);
1753 dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0); 1840 dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0);
1754 - crisv32_alu_op(dc, CC_OP_BTST, dc->op2, 4);  
1755 1841
  1842 + cris_alu(dc, CC_OP_BTST,
  1843 + cpu_T[0], cpu_T[0], cpu_T[1], 4);
1756 cris_update_cc_op(dc, CC_OP_FLAGS, 4); 1844 cris_update_cc_op(dc, CC_OP_FLAGS, 4);
1757 t_gen_mov_preg_TN(dc, PR_CCS, cpu_T[0]); 1845 t_gen_mov_preg_TN(dc, PR_CCS, cpu_T[0]);
1758 - dc->flags_live = 1; 1846 + dc->flags_uptodate = 1;
1759 return 2; 1847 return 2;
1760 } 1848 }
1761 1849
@@ -1766,7 +1854,8 @@ static unsigned int dec_sub_r(DisasContext *dc) @@ -1766,7 +1854,8 @@ static unsigned int dec_sub_r(DisasContext *dc)
1766 memsize_char(size), dc->op1, dc->op2)); 1854 memsize_char(size), dc->op1, dc->op2));
1767 cris_cc_mask(dc, CC_MASK_NZVC); 1855 cris_cc_mask(dc, CC_MASK_NZVC);
1768 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0); 1856 dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0);
1769 - crisv32_alu_op(dc, CC_OP_SUB, dc->op2, size); 1857 + cris_alu(dc, CC_OP_SUB,
  1858 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], size);
1770 return 2; 1859 return 2;
1771 } 1860 }
1772 1861
@@ -1779,8 +1868,9 @@ static unsigned int dec_movu_r(DisasContext *dc) @@ -1779,8 +1868,9 @@ static unsigned int dec_movu_r(DisasContext *dc)
1779 dc->op1, dc->op2)); 1868 dc->op1, dc->op2));
1780 1869
1781 cris_cc_mask(dc, CC_MASK_NZ); 1870 cris_cc_mask(dc, CC_MASK_NZ);
1782 - dec_prep_move_r(dc, dc->op1, dc->op2, size, 0);  
1783 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); 1871 + dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, cpu_T[1]);
  1872 + cris_alu(dc, CC_OP_MOVE,
  1873 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
1784 return 2; 1874 return 2;
1785 } 1875 }
1786 1876
@@ -1795,8 +1885,9 @@ static unsigned int dec_movs_r(DisasContext *dc) @@ -1795,8 +1885,9 @@ static unsigned int dec_movs_r(DisasContext *dc)
1795 cris_cc_mask(dc, CC_MASK_NZ); 1885 cris_cc_mask(dc, CC_MASK_NZ);
1796 t_gen_mov_TN_reg(cpu_T[0], dc->op1); 1886 t_gen_mov_TN_reg(cpu_T[0], dc->op1);
1797 /* Size can only be qi or hi. */ 1887 /* Size can only be qi or hi. */
1798 - t_gen_sext(cpu_T[1], cpu_T[0], size);  
1799 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); 1888 + t_gen_sext(cpu_T[1], cpu_R[dc->op1], size);
  1889 + cris_alu(dc, CC_OP_MOVE,
  1890 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
1800 return 2; 1891 return 2;
1801 } 1892 }
1802 1893
@@ -1809,11 +1900,10 @@ static unsigned int dec_addu_r(DisasContext *dc) @@ -1809,11 +1900,10 @@ static unsigned int dec_addu_r(DisasContext *dc)
1809 dc->op1, dc->op2)); 1900 dc->op1, dc->op2));
1810 1901
1811 cris_cc_mask(dc, CC_MASK_NZVC); 1902 cris_cc_mask(dc, CC_MASK_NZVC);
1812 - t_gen_mov_TN_reg(cpu_T[1], dc->op1);  
1813 /* Size can only be qi or hi. */ 1903 /* Size can only be qi or hi. */
1814 - t_gen_zext(cpu_T[1], cpu_T[1], size);  
1815 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1816 - crisv32_alu_op(dc, CC_OP_ADD, dc->op2, 4); 1904 + t_gen_zext(cpu_T[1], cpu_R[dc->op1], size);
  1905 + cris_alu(dc, CC_OP_ADD,
  1906 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
1817 return 2; 1907 return 2;
1818 } 1908 }
1819 1909
@@ -1826,12 +1916,10 @@ static unsigned int dec_adds_r(DisasContext *dc) @@ -1826,12 +1916,10 @@ static unsigned int dec_adds_r(DisasContext *dc)
1826 dc->op1, dc->op2)); 1916 dc->op1, dc->op2));
1827 1917
1828 cris_cc_mask(dc, CC_MASK_NZVC); 1918 cris_cc_mask(dc, CC_MASK_NZVC);
1829 - t_gen_mov_TN_reg(cpu_T[1], dc->op1);  
1830 /* Size can only be qi or hi. */ 1919 /* Size can only be qi or hi. */
1831 - t_gen_sext(cpu_T[1], cpu_T[1], size);  
1832 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1833 -  
1834 - crisv32_alu_op(dc, CC_OP_ADD, dc->op2, 4); 1920 + t_gen_sext(cpu_T[1], cpu_R[dc->op1], size);
  1921 + cris_alu(dc, CC_OP_ADD,
  1922 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
1835 return 2; 1923 return 2;
1836 } 1924 }
1837 1925
@@ -1844,11 +1932,10 @@ static unsigned int dec_subu_r(DisasContext *dc) @@ -1844,11 +1932,10 @@ static unsigned int dec_subu_r(DisasContext *dc)
1844 dc->op1, dc->op2)); 1932 dc->op1, dc->op2));
1845 1933
1846 cris_cc_mask(dc, CC_MASK_NZVC); 1934 cris_cc_mask(dc, CC_MASK_NZVC);
1847 - t_gen_mov_TN_reg(cpu_T[1], dc->op1);  
1848 /* Size can only be qi or hi. */ 1935 /* Size can only be qi or hi. */
1849 - t_gen_zext(cpu_T[1], cpu_T[1], size);  
1850 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1851 - crisv32_alu_op(dc, CC_OP_SUB, dc->op2, 4); 1936 + t_gen_zext(cpu_T[1], cpu_R[dc->op1], size);
  1937 + cris_alu(dc, CC_OP_SUB,
  1938 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
1852 return 2; 1939 return 2;
1853 } 1940 }
1854 1941
@@ -1861,11 +1948,10 @@ static unsigned int dec_subs_r(DisasContext *dc) @@ -1861,11 +1948,10 @@ static unsigned int dec_subs_r(DisasContext *dc)
1861 dc->op1, dc->op2)); 1948 dc->op1, dc->op2));
1862 1949
1863 cris_cc_mask(dc, CC_MASK_NZVC); 1950 cris_cc_mask(dc, CC_MASK_NZVC);
1864 - t_gen_mov_TN_reg(cpu_T[1], dc->op1);  
1865 /* Size can only be qi or hi. */ 1951 /* Size can only be qi or hi. */
1866 - t_gen_sext(cpu_T[1], cpu_T[1], size);  
1867 - t_gen_mov_TN_reg(cpu_T[0], dc->op2);  
1868 - crisv32_alu_op(dc, CC_OP_SUB, dc->op2, 4); 1952 + t_gen_sext(cpu_T[1], cpu_R[dc->op1], size);
  1953 + cris_alu(dc, CC_OP_SUB,
  1954 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
1869 return 2; 1955 return 2;
1870 } 1956 }
1871 1957
@@ -1879,6 +1965,7 @@ static unsigned int dec_setclrf(DisasContext *dc) @@ -1879,6 +1965,7 @@ static unsigned int dec_setclrf(DisasContext *dc)
1879 DIS(fprintf (logfile, "set=%d flags=%x\n", set, flags)); 1965 DIS(fprintf (logfile, "set=%d flags=%x\n", set, flags));
1880 if (set && flags == 0) { 1966 if (set && flags == 0) {
1881 DIS(fprintf (logfile, "nop\n")); 1967 DIS(fprintf (logfile, "nop\n"));
  1968 + return 2;
1882 } else if (!set && (flags & 0x20)) { 1969 } else if (!set && (flags & 0x20)) {
1883 DIS(fprintf (logfile, "di\n")); 1970 DIS(fprintf (logfile, "di\n"));
1884 } 1971 }
@@ -1889,13 +1976,16 @@ static unsigned int dec_setclrf(DisasContext *dc) @@ -1889,13 +1976,16 @@ static unsigned int dec_setclrf(DisasContext *dc)
1889 } 1976 }
1890 1977
1891 if (set && (flags & X_FLAG)) { 1978 if (set && (flags & X_FLAG)) {
1892 - dc->flagx_live = 1;  
1893 - dc->flags_x = 1; 1979 + dc->flagx_known = 1;
  1980 + dc->flags_x = X_FLAG;
  1981 + } else {
  1982 + dc->flagx_known = 0;
1894 } 1983 }
1895 1984
1896 /* Simply decode the flags. */ 1985 /* Simply decode the flags. */
1897 cris_evaluate_flags (dc); 1986 cris_evaluate_flags (dc);
1898 cris_update_cc_op(dc, CC_OP_FLAGS, 4); 1987 cris_update_cc_op(dc, CC_OP_FLAGS, 4);
  1988 + cris_update_cc_x(dc);
1899 tcg_gen_movi_tl(cc_op, dc->cc_op); 1989 tcg_gen_movi_tl(cc_op, dc->cc_op);
1900 1990
1901 if (set) { 1991 if (set) {
@@ -1910,7 +2000,7 @@ static unsigned int dec_setclrf(DisasContext *dc) @@ -1910,7 +2000,7 @@ static unsigned int dec_setclrf(DisasContext *dc)
1910 else 2000 else
1911 tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~flags); 2001 tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~flags);
1912 2002
1913 - dc->flags_live = 1; 2003 + dc->flags_uptodate = 1;
1914 dc->clear_x = 0; 2004 dc->clear_x = 0;
1915 return 2; 2005 return 2;
1916 } 2006 }
@@ -1953,7 +2043,7 @@ static unsigned int dec_move_rp(DisasContext *dc) @@ -1953,7 +2043,7 @@ static unsigned int dec_move_rp(DisasContext *dc)
1953 t_gen_mov_preg_TN(dc, dc->op2, cpu_T[0]); 2043 t_gen_mov_preg_TN(dc, dc->op2, cpu_T[0]);
1954 if (dc->op2 == PR_CCS) { 2044 if (dc->op2 == PR_CCS) {
1955 cris_update_cc_op(dc, CC_OP_FLAGS, 4); 2045 cris_update_cc_op(dc, CC_OP_FLAGS, 4);
1956 - dc->flags_live = 1; 2046 + dc->flags_uptodate = 1;
1957 } 2047 }
1958 return 2; 2048 return 2;
1959 } 2049 }
@@ -1970,7 +2060,9 @@ static unsigned int dec_move_pr(DisasContext *dc) @@ -1970,7 +2060,9 @@ static unsigned int dec_move_pr(DisasContext *dc)
1970 t_gen_mov_TN_preg(cpu_T[1], dc->op2); 2060 t_gen_mov_TN_preg(cpu_T[1], dc->op2);
1971 } else 2061 } else
1972 t_gen_mov_TN_preg(cpu_T[1], dc->op2); 2062 t_gen_mov_TN_preg(cpu_T[1], dc->op2);
1973 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op1, preg_sizes[dc->op2]); 2063 + cris_alu(dc, CC_OP_MOVE,
  2064 + cpu_R[dc->op1], cpu_R[dc->op1], cpu_T[1],
  2065 + preg_sizes[dc->op2]);
1974 return 2; 2066 return 2;
1975 } 2067 }
1976 2068
@@ -1983,9 +2075,19 @@ static unsigned int dec_move_mr(DisasContext *dc) @@ -1983,9 +2075,19 @@ static unsigned int dec_move_mr(DisasContext *dc)
1983 dc->op1, dc->postinc ? "+]" : "]", 2075 dc->op1, dc->postinc ? "+]" : "]",
1984 dc->op2)); 2076 dc->op2));
1985 2077
1986 - insn_len = dec_prep_move_m(dc, 0, memsize);  
1987 - cris_cc_mask(dc, CC_MASK_NZ);  
1988 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, memsize); 2078 + if (memsize == 4) {
  2079 + insn_len = dec_prep_move_m(dc, 0, 4, cpu_R[dc->op2]);
  2080 + cris_cc_mask(dc, CC_MASK_NZ);
  2081 + cris_update_cc_op(dc, CC_OP_MOVE, 4);
  2082 + cris_update_cc_x(dc);
  2083 + cris_update_result(dc, cpu_R[dc->op2]);
  2084 + }
  2085 + else {
  2086 + insn_len = dec_prep_move_m(dc, 0, memsize, cpu_T[1]);
  2087 + cris_cc_mask(dc, CC_MASK_NZ);
  2088 + cris_alu(dc, CC_OP_MOVE,
  2089 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], memsize);
  2090 + }
1989 do_postinc(dc, memsize); 2091 do_postinc(dc, memsize);
1990 return insn_len; 2092 return insn_len;
1991 } 2093 }
@@ -2002,7 +2104,8 @@ static unsigned int dec_movs_m(DisasContext *dc) @@ -2002,7 +2104,8 @@ static unsigned int dec_movs_m(DisasContext *dc)
2002 /* sign extend. */ 2104 /* sign extend. */
2003 insn_len = dec_prep_alu_m(dc, 1, memsize); 2105 insn_len = dec_prep_alu_m(dc, 1, memsize);
2004 cris_cc_mask(dc, CC_MASK_NZ); 2106 cris_cc_mask(dc, CC_MASK_NZ);
2005 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); 2107 + cris_alu(dc, CC_OP_MOVE,
  2108 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
2006 do_postinc(dc, memsize); 2109 do_postinc(dc, memsize);
2007 return insn_len; 2110 return insn_len;
2008 } 2111 }
@@ -2019,7 +2122,8 @@ static unsigned int dec_addu_m(DisasContext *dc) @@ -2019,7 +2122,8 @@ static unsigned int dec_addu_m(DisasContext *dc)
2019 /* sign extend. */ 2122 /* sign extend. */
2020 insn_len = dec_prep_alu_m(dc, 0, memsize); 2123 insn_len = dec_prep_alu_m(dc, 0, memsize);
2021 cris_cc_mask(dc, CC_MASK_NZVC); 2124 cris_cc_mask(dc, CC_MASK_NZVC);
2022 - crisv32_alu_op(dc, CC_OP_ADD, dc->op2, 4); 2125 + cris_alu(dc, CC_OP_ADD,
  2126 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
2023 do_postinc(dc, memsize); 2127 do_postinc(dc, memsize);
2024 return insn_len; 2128 return insn_len;
2025 } 2129 }
@@ -2036,7 +2140,8 @@ static unsigned int dec_adds_m(DisasContext *dc) @@ -2036,7 +2140,8 @@ static unsigned int dec_adds_m(DisasContext *dc)
2036 /* sign extend. */ 2140 /* sign extend. */
2037 insn_len = dec_prep_alu_m(dc, 1, memsize); 2141 insn_len = dec_prep_alu_m(dc, 1, memsize);
2038 cris_cc_mask(dc, CC_MASK_NZVC); 2142 cris_cc_mask(dc, CC_MASK_NZVC);
2039 - crisv32_alu_op(dc, CC_OP_ADD, dc->op2, 4); 2143 + cris_alu(dc, CC_OP_ADD,
  2144 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
2040 do_postinc(dc, memsize); 2145 do_postinc(dc, memsize);
2041 return insn_len; 2146 return insn_len;
2042 } 2147 }
@@ -2053,7 +2158,8 @@ static unsigned int dec_subu_m(DisasContext *dc) @@ -2053,7 +2158,8 @@ static unsigned int dec_subu_m(DisasContext *dc)
2053 /* sign extend. */ 2158 /* sign extend. */
2054 insn_len = dec_prep_alu_m(dc, 0, memsize); 2159 insn_len = dec_prep_alu_m(dc, 0, memsize);
2055 cris_cc_mask(dc, CC_MASK_NZVC); 2160 cris_cc_mask(dc, CC_MASK_NZVC);
2056 - crisv32_alu_op(dc, CC_OP_SUB, dc->op2, 4); 2161 + cris_alu(dc, CC_OP_SUB,
  2162 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
2057 do_postinc(dc, memsize); 2163 do_postinc(dc, memsize);
2058 return insn_len; 2164 return insn_len;
2059 } 2165 }
@@ -2070,7 +2176,8 @@ static unsigned int dec_subs_m(DisasContext *dc) @@ -2070,7 +2176,8 @@ static unsigned int dec_subs_m(DisasContext *dc)
2070 /* sign extend. */ 2176 /* sign extend. */
2071 insn_len = dec_prep_alu_m(dc, 1, memsize); 2177 insn_len = dec_prep_alu_m(dc, 1, memsize);
2072 cris_cc_mask(dc, CC_MASK_NZVC); 2178 cris_cc_mask(dc, CC_MASK_NZVC);
2073 - crisv32_alu_op(dc, CC_OP_SUB, dc->op2, 4); 2179 + cris_alu(dc, CC_OP_SUB,
  2180 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
2074 do_postinc(dc, memsize); 2181 do_postinc(dc, memsize);
2075 return insn_len; 2182 return insn_len;
2076 } 2183 }
@@ -2087,7 +2194,8 @@ static unsigned int dec_movu_m(DisasContext *dc) @@ -2087,7 +2194,8 @@ static unsigned int dec_movu_m(DisasContext *dc)
2087 2194
2088 insn_len = dec_prep_alu_m(dc, 0, memsize); 2195 insn_len = dec_prep_alu_m(dc, 0, memsize);
2089 cris_cc_mask(dc, CC_MASK_NZ); 2196 cris_cc_mask(dc, CC_MASK_NZ);
2090 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); 2197 + cris_alu(dc, CC_OP_MOVE,
  2198 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
2091 do_postinc(dc, memsize); 2199 do_postinc(dc, memsize);
2092 return insn_len; 2200 return insn_len;
2093 } 2201 }
@@ -2103,7 +2211,8 @@ static unsigned int dec_cmpu_m(DisasContext *dc) @@ -2103,7 +2211,8 @@ static unsigned int dec_cmpu_m(DisasContext *dc)
2103 2211
2104 insn_len = dec_prep_alu_m(dc, 0, memsize); 2212 insn_len = dec_prep_alu_m(dc, 0, memsize);
2105 cris_cc_mask(dc, CC_MASK_NZVC); 2213 cris_cc_mask(dc, CC_MASK_NZVC);
2106 - crisv32_alu_op(dc, CC_OP_CMP, dc->op2, 4); 2214 + cris_alu(dc, CC_OP_CMP,
  2215 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4);
2107 do_postinc(dc, memsize); 2216 do_postinc(dc, memsize);
2108 return insn_len; 2217 return insn_len;
2109 } 2218 }
@@ -2119,7 +2228,9 @@ static unsigned int dec_cmps_m(DisasContext *dc) @@ -2119,7 +2228,9 @@ static unsigned int dec_cmps_m(DisasContext *dc)
2119 2228
2120 insn_len = dec_prep_alu_m(dc, 1, memsize); 2229 insn_len = dec_prep_alu_m(dc, 1, memsize);
2121 cris_cc_mask(dc, CC_MASK_NZVC); 2230 cris_cc_mask(dc, CC_MASK_NZVC);
2122 - crisv32_alu_op(dc, CC_OP_CMP, dc->op2, memsize_zz(dc)); 2231 + cris_alu(dc, CC_OP_CMP,
  2232 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1],
  2233 + memsize_zz(dc));
2123 do_postinc(dc, memsize); 2234 do_postinc(dc, memsize);
2124 return insn_len; 2235 return insn_len;
2125 } 2236 }
@@ -2135,7 +2246,9 @@ static unsigned int dec_cmp_m(DisasContext *dc) @@ -2135,7 +2246,9 @@ static unsigned int dec_cmp_m(DisasContext *dc)
2135 2246
2136 insn_len = dec_prep_alu_m(dc, 0, memsize); 2247 insn_len = dec_prep_alu_m(dc, 0, memsize);
2137 cris_cc_mask(dc, CC_MASK_NZVC); 2248 cris_cc_mask(dc, CC_MASK_NZVC);
2138 - crisv32_alu_op(dc, CC_OP_CMP, dc->op2, memsize_zz(dc)); 2249 + cris_alu(dc, CC_OP_CMP,
  2250 + cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1],
  2251 + memsize_zz(dc));
2139 do_postinc(dc, memsize); 2252 do_postinc(dc, memsize);
2140 return insn_len; 2253 return insn_len;
2141 } 2254 }
@@ -2155,9 +2268,9 @@ static unsigned int dec_test_m(DisasContext *dc) @@ -2155,9 +2268,9 @@ static unsigned int dec_test_m(DisasContext *dc)
2155 cris_cc_mask(dc, CC_MASK_NZ); 2268 cris_cc_mask(dc, CC_MASK_NZ);
2156 tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~3); 2269 tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~3);
2157 2270
2158 - tcg_gen_mov_tl(cpu_T[0], cpu_T[1]);  
2159 - tcg_gen_movi_tl(cpu_T[1], 0);  
2160 - crisv32_alu_op(dc, CC_OP_CMP, dc->op2, memsize_zz(dc)); 2271 + cris_alu(dc, CC_OP_CMP,
  2272 + cpu_R[dc->op2], cpu_T[1], tcg_const_tl(0),
  2273 + memsize_zz(dc));
2161 do_postinc(dc, memsize); 2274 do_postinc(dc, memsize);
2162 return insn_len; 2275 return insn_len;
2163 } 2276 }
@@ -2173,7 +2286,9 @@ static unsigned int dec_and_m(DisasContext *dc) @@ -2173,7 +2286,9 @@ static unsigned int dec_and_m(DisasContext *dc)
2173 2286
2174 insn_len = dec_prep_alu_m(dc, 0, memsize); 2287 insn_len = dec_prep_alu_m(dc, 0, memsize);
2175 cris_cc_mask(dc, CC_MASK_NZ); 2288 cris_cc_mask(dc, CC_MASK_NZ);
2176 - crisv32_alu_op(dc, CC_OP_AND, dc->op2, memsize_zz(dc)); 2289 + cris_alu(dc, CC_OP_AND,
  2290 + cpu_R[dc->op2], cpu_T[0], cpu_T[1],
  2291 + memsize_zz(dc));
2177 do_postinc(dc, memsize); 2292 do_postinc(dc, memsize);
2178 return insn_len; 2293 return insn_len;
2179 } 2294 }
@@ -2189,7 +2304,9 @@ static unsigned int dec_add_m(DisasContext *dc) @@ -2189,7 +2304,9 @@ static unsigned int dec_add_m(DisasContext *dc)
2189 2304
2190 insn_len = dec_prep_alu_m(dc, 0, memsize); 2305 insn_len = dec_prep_alu_m(dc, 0, memsize);
2191 cris_cc_mask(dc, CC_MASK_NZVC); 2306 cris_cc_mask(dc, CC_MASK_NZVC);
2192 - crisv32_alu_op(dc, CC_OP_ADD, dc->op2, memsize_zz(dc)); 2307 + cris_alu(dc, CC_OP_ADD,
  2308 + cpu_R[dc->op2], cpu_T[0], cpu_T[1],
  2309 + memsize_zz(dc));
2193 do_postinc(dc, memsize); 2310 do_postinc(dc, memsize);
2194 return insn_len; 2311 return insn_len;
2195 } 2312 }
@@ -2205,7 +2322,8 @@ static unsigned int dec_addo_m(DisasContext *dc) @@ -2205,7 +2322,8 @@ static unsigned int dec_addo_m(DisasContext *dc)
2205 2322
2206 insn_len = dec_prep_alu_m(dc, 1, memsize); 2323 insn_len = dec_prep_alu_m(dc, 1, memsize);
2207 cris_cc_mask(dc, 0); 2324 cris_cc_mask(dc, 0);
2208 - crisv32_alu_op(dc, CC_OP_ADD, R_ACR, 4); 2325 + cris_alu(dc, CC_OP_ADD,
  2326 + cpu_R[R_ACR], cpu_T[0], cpu_T[1], 4);
2209 do_postinc(dc, memsize); 2327 do_postinc(dc, memsize);
2210 return insn_len; 2328 return insn_len;
2211 } 2329 }
@@ -2221,7 +2339,8 @@ static unsigned int dec_bound_m(DisasContext *dc) @@ -2221,7 +2339,8 @@ static unsigned int dec_bound_m(DisasContext *dc)
2221 2339
2222 insn_len = dec_prep_alu_m(dc, 0, memsize); 2340 insn_len = dec_prep_alu_m(dc, 0, memsize);
2223 cris_cc_mask(dc, CC_MASK_NZ); 2341 cris_cc_mask(dc, CC_MASK_NZ);
2224 - crisv32_alu_op(dc, CC_OP_BOUND, dc->op2, 4); 2342 + cris_alu(dc, CC_OP_BOUND,
  2343 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
2225 do_postinc(dc, memsize); 2344 do_postinc(dc, memsize);
2226 return insn_len; 2345 return insn_len;
2227 } 2346 }
@@ -2236,7 +2355,8 @@ static unsigned int dec_addc_mr(DisasContext *dc) @@ -2236,7 +2355,8 @@ static unsigned int dec_addc_mr(DisasContext *dc)
2236 cris_evaluate_flags(dc); 2355 cris_evaluate_flags(dc);
2237 insn_len = dec_prep_alu_m(dc, 0, 4); 2356 insn_len = dec_prep_alu_m(dc, 0, 4);
2238 cris_cc_mask(dc, CC_MASK_NZVC); 2357 cris_cc_mask(dc, CC_MASK_NZVC);
2239 - crisv32_alu_op(dc, CC_OP_ADDC, dc->op2, 4); 2358 + cris_alu(dc, CC_OP_ADDC,
  2359 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
2240 do_postinc(dc, 4); 2360 do_postinc(dc, 4);
2241 return insn_len; 2361 return insn_len;
2242 } 2362 }
@@ -2252,7 +2372,8 @@ static unsigned int dec_sub_m(DisasContext *dc) @@ -2252,7 +2372,8 @@ static unsigned int dec_sub_m(DisasContext *dc)
2252 2372
2253 insn_len = dec_prep_alu_m(dc, 0, memsize); 2373 insn_len = dec_prep_alu_m(dc, 0, memsize);
2254 cris_cc_mask(dc, CC_MASK_NZVC); 2374 cris_cc_mask(dc, CC_MASK_NZVC);
2255 - crisv32_alu_op(dc, CC_OP_SUB, dc->op2, memsize); 2375 + cris_alu(dc, CC_OP_SUB,
  2376 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], memsize);
2256 do_postinc(dc, memsize); 2377 do_postinc(dc, memsize);
2257 return insn_len; 2378 return insn_len;
2258 } 2379 }
@@ -2268,7 +2389,8 @@ static unsigned int dec_or_m(DisasContext *dc) @@ -2268,7 +2389,8 @@ static unsigned int dec_or_m(DisasContext *dc)
2268 2389
2269 insn_len = dec_prep_alu_m(dc, 0, memsize); 2390 insn_len = dec_prep_alu_m(dc, 0, memsize);
2270 cris_cc_mask(dc, CC_MASK_NZ); 2391 cris_cc_mask(dc, CC_MASK_NZ);
2271 - crisv32_alu_op(dc, CC_OP_OR, dc->op2, memsize_zz(dc)); 2392 + cris_alu(dc, CC_OP_OR,
  2393 + cpu_R[dc->op2], cpu_T[0], cpu_T[1], memsize_zz(dc));
2272 do_postinc(dc, memsize); 2394 do_postinc(dc, memsize);
2273 return insn_len; 2395 return insn_len;
2274 } 2396 }
@@ -2316,6 +2438,7 @@ static unsigned int dec_move_pm(DisasContext *dc) @@ -2316,6 +2438,7 @@ static unsigned int dec_move_pm(DisasContext *dc)
2316 if (dc->op2 == PR_CCS) 2438 if (dc->op2 == PR_CCS)
2317 cris_evaluate_flags(dc); 2439 cris_evaluate_flags(dc);
2318 t_gen_mov_TN_preg(cpu_T[1], dc->op2); 2440 t_gen_mov_TN_preg(cpu_T[1], dc->op2);
  2441 + cris_flush_cc_state(dc);
2319 gen_store(dc, cpu_R[dc->op1], cpu_T[1], memsize); 2442 gen_store(dc, cpu_R[dc->op1], cpu_T[1], memsize);
2320 2443
2321 cris_cc_mask(dc, 0); 2444 cris_cc_mask(dc, 0);
@@ -2333,6 +2456,7 @@ static unsigned int dec_movem_mr(DisasContext *dc) @@ -2333,6 +2456,7 @@ static unsigned int dec_movem_mr(DisasContext *dc)
2333 dc->postinc ? "+]" : "]", dc->op2)); 2456 dc->postinc ? "+]" : "]", dc->op2));
2334 2457
2335 /* fetch the address into T0 and T1. */ 2458 /* fetch the address into T0 and T1. */
  2459 + cris_flush_cc_state(dc);
2336 for (i = 0; i <= dc->op2; i++) { 2460 for (i = 0; i <= dc->op2; i++) {
2337 tmp[i] = tcg_temp_new(TCG_TYPE_TL); 2461 tmp[i] = tcg_temp_new(TCG_TYPE_TL);
2338 /* Perform the load onto regnum i. Always dword wide. */ 2462 /* Perform the load onto regnum i. Always dword wide. */
@@ -2342,7 +2466,7 @@ static unsigned int dec_movem_mr(DisasContext *dc) @@ -2342,7 +2466,7 @@ static unsigned int dec_movem_mr(DisasContext *dc)
2342 2466
2343 for (i = 0; i <= dc->op2; i++) { 2467 for (i = 0; i <= dc->op2; i++) {
2344 tcg_gen_mov_tl(cpu_R[i], tmp[i]); 2468 tcg_gen_mov_tl(cpu_R[i], tmp[i]);
2345 - tcg_gen_discard_tl(tmp[i]); 2469 + tcg_temp_free(tmp[i]);
2346 } 2470 }
2347 2471
2348 /* writeback the updated pointer value. */ 2472 /* writeback the updated pointer value. */
@@ -2356,20 +2480,27 @@ static unsigned int dec_movem_mr(DisasContext *dc) @@ -2356,20 +2480,27 @@ static unsigned int dec_movem_mr(DisasContext *dc)
2356 2480
2357 static unsigned int dec_movem_rm(DisasContext *dc) 2481 static unsigned int dec_movem_rm(DisasContext *dc)
2358 { 2482 {
  2483 + TCGv tmp;
2359 int i; 2484 int i;
2360 2485
2361 DIS(fprintf (logfile, "movem $r%u, [$r%u%s\n", dc->op2, dc->op1, 2486 DIS(fprintf (logfile, "movem $r%u, [$r%u%s\n", dc->op2, dc->op1,
2362 dc->postinc ? "+]" : "]")); 2487 dc->postinc ? "+]" : "]"));
2363 2488
  2489 + cris_flush_cc_state(dc);
  2490 +
  2491 + tmp = tcg_temp_new(TCG_TYPE_TL);
  2492 + tcg_gen_movi_tl(tmp, 4);
  2493 + tcg_gen_mov_tl(cpu_T[0], cpu_R[dc->op1]);
2364 for (i = 0; i <= dc->op2; i++) { 2494 for (i = 0; i <= dc->op2; i++) {
2365 /* Displace addr. */ 2495 /* Displace addr. */
2366 - tcg_gen_addi_tl(cpu_T[0], cpu_R[dc->op1], i * 4);  
2367 /* Perform the store. */ 2496 /* Perform the store. */
2368 gen_store(dc, cpu_T[0], cpu_R[i], 4); 2497 gen_store(dc, cpu_T[0], cpu_R[i], 4);
  2498 + tcg_gen_add_tl(cpu_T[0], cpu_T[0], tmp);
2369 } 2499 }
2370 if (dc->postinc) 2500 if (dc->postinc)
2371 - tcg_gen_addi_tl(cpu_R[dc->op1], cpu_R[dc->op1], i * 4); 2501 + tcg_gen_mov_tl(cpu_R[dc->op1], cpu_T[0]);
2372 cris_cc_mask(dc, 0); 2502 cris_cc_mask(dc, 0);
  2503 + tcg_temp_free(tmp);
2373 return 2; 2504 return 2;
2374 } 2505 }
2375 2506
@@ -2383,6 +2514,7 @@ static unsigned int dec_move_rm(DisasContext *dc) @@ -2383,6 +2514,7 @@ static unsigned int dec_move_rm(DisasContext *dc)
2383 memsize, dc->op2, dc->op1)); 2514 memsize, dc->op2, dc->op1));
2384 2515
2385 /* prepare store. */ 2516 /* prepare store. */
  2517 + cris_flush_cc_state(dc);
2386 gen_store(dc, cpu_R[dc->op1], cpu_R[dc->op2], memsize); 2518 gen_store(dc, cpu_R[dc->op1], cpu_R[dc->op2], memsize);
2387 2519
2388 if (dc->postinc) 2520 if (dc->postinc)
@@ -2396,8 +2528,7 @@ static unsigned int dec_lapcq(DisasContext *dc) @@ -2396,8 +2528,7 @@ static unsigned int dec_lapcq(DisasContext *dc)
2396 DIS(fprintf (logfile, "lapcq %x, $r%u\n", 2528 DIS(fprintf (logfile, "lapcq %x, $r%u\n",
2397 dc->pc + dc->op1*2, dc->op2)); 2529 dc->pc + dc->op1*2, dc->op2));
2398 cris_cc_mask(dc, 0); 2530 cris_cc_mask(dc, 0);
2399 - tcg_gen_movi_tl(cpu_T[1], dc->pc + dc->op1 * 2);  
2400 - crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); 2531 + tcg_gen_movi_tl(cpu_R[dc->op2], dc->pc + dc->op1 * 2);
2401 return 2; 2532 return 2;
2402 } 2533 }
2403 2534
@@ -2443,8 +2574,7 @@ static unsigned int dec_jas_r(DisasContext *dc) @@ -2443,8 +2574,7 @@ static unsigned int dec_jas_r(DisasContext *dc)
2443 tcg_gen_mov_tl(env_btarget, cpu_R[dc->op1]); 2574 tcg_gen_mov_tl(env_btarget, cpu_R[dc->op1]);
2444 if (dc->op2 > 15) 2575 if (dc->op2 > 15)
2445 abort(); 2576 abort();
2446 - tcg_gen_movi_tl(cpu_T[0], dc->pc + 4);  
2447 - tcg_gen_mov_tl(cpu_PR[dc->op2], cpu_T[0]); 2577 + t_gen_mov_preg_TN(dc, dc->op2, tcg_const_tl(dc->pc + 4));
2448 2578
2449 cris_prepare_dyn_jmp(dc); 2579 cris_prepare_dyn_jmp(dc);
2450 return 2; 2580 return 2;
@@ -2827,12 +2957,15 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, @@ -2827,12 +2957,15 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
2827 dc->ppc = pc_start; 2957 dc->ppc = pc_start;
2828 dc->pc = pc_start; 2958 dc->pc = pc_start;
2829 dc->singlestep_enabled = env->singlestep_enabled; 2959 dc->singlestep_enabled = env->singlestep_enabled;
2830 - dc->flags_live = 1;  
2831 - dc->flagx_live = 0;  
2832 - dc->flags_x = 0; 2960 + dc->flags_uptodate = 1;
  2961 + dc->flagx_known = 1;
  2962 + dc->flags_x = tb->flags & X_FLAG;
  2963 + dc->cc_x_uptodate = 0;
2833 dc->cc_mask = 0; 2964 dc->cc_mask = 0;
2834 dc->update_cc = 0; 2965 dc->update_cc = 0;
  2966 +
2835 cris_update_cc_op(dc, CC_OP_FLAGS, 4); 2967 cris_update_cc_op(dc, CC_OP_FLAGS, 4);
  2968 + dc->cc_size_uptodate = -1;
2836 2969
2837 /* Decode TB flags. */ 2970 /* Decode TB flags. */
2838 dc->user = tb->flags & U_FLAG; 2971 dc->user = tb->flags & U_FLAG;
@@ -2841,7 +2974,7 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, @@ -2841,7 +2974,7 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
2841 if (loglevel & CPU_LOG_TB_IN_ASM) { 2974 if (loglevel & CPU_LOG_TB_IN_ASM) {
2842 fprintf(logfile, 2975 fprintf(logfile,
2843 "srch=%d pc=%x %x bt=%x ds=%lld ccs=%x\n" 2976 "srch=%d pc=%x %x bt=%x ds=%lld ccs=%x\n"
2844 - "pid=%x usp=%x dbg=%x %x %x\n" 2977 + "pid=%x usp=%x\n"
2845 "%x.%x.%x.%x\n" 2978 "%x.%x.%x.%x\n"
2846 "%x.%x.%x.%x\n" 2979 "%x.%x.%x.%x\n"
2847 "%x.%x.%x.%x\n" 2980 "%x.%x.%x.%x\n"
@@ -2850,7 +2983,6 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, @@ -2850,7 +2983,6 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
2850 env->btarget, tb->flags & 7, 2983 env->btarget, tb->flags & 7,
2851 env->pregs[PR_CCS], 2984 env->pregs[PR_CCS],
2852 env->pregs[PR_PID], env->pregs[PR_USP], 2985 env->pregs[PR_PID], env->pregs[PR_USP],
2853 - env->debug1, env->debug2, env->debug3,  
2854 env->regs[0], env->regs[1], env->regs[2], env->regs[3], 2986 env->regs[0], env->regs[1], env->regs[2], env->regs[3],
2855 env->regs[4], env->regs[5], env->regs[6], env->regs[7], 2987 env->regs[4], env->regs[5], env->regs[6], env->regs[7],
2856 env->regs[8], env->regs[9], 2988 env->regs[8], env->regs[9],
@@ -2890,6 +3022,8 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, @@ -2890,6 +3022,8 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
2890 } 3022 }
2891 3023
2892 dc->clear_x = 1; 3024 dc->clear_x = 1;
  3025 + if (unlikely(loglevel & CPU_LOG_TB_OP))
  3026 + tcg_gen_debug_insn_start(dc->pc);
2893 insn_len = cris_decoder(dc); 3027 insn_len = cris_decoder(dc);
2894 dc->ppc = dc->pc; 3028 dc->ppc = dc->pc;
2895 dc->pc += insn_len; 3029 dc->pc += insn_len;
@@ -2996,12 +3130,11 @@ void cpu_dump_state (CPUState *env, FILE *f, @@ -2996,12 +3130,11 @@ void cpu_dump_state (CPUState *env, FILE *f,
2996 return; 3130 return;
2997 3131
2998 cpu_fprintf(f, "PC=%x CCS=%x btaken=%d btarget=%x\n" 3132 cpu_fprintf(f, "PC=%x CCS=%x btaken=%d btarget=%x\n"
2999 - "cc_op=%d cc_src=%d cc_dest=%d cc_result=%x cc_mask=%x\n"  
3000 - "debug=%x %x %x\n", 3133 + "cc_op=%d cc_src=%d cc_dest=%d cc_result=%x cc_mask=%x\n",
3001 env->pc, env->pregs[PR_CCS], env->btaken, env->btarget, 3134 env->pc, env->pregs[PR_CCS], env->btaken, env->btarget,
3002 env->cc_op, 3135 env->cc_op,
3003 - env->cc_src, env->cc_dest, env->cc_result, env->cc_mask,  
3004 - env->debug1, env->debug2, env->debug3); 3136 + env->cc_src, env->cc_dest, env->cc_result, env->cc_mask);
  3137 +
3005 3138
3006 for (i = 0; i < 16; i++) { 3139 for (i = 0; i < 16; i++) {
3007 cpu_fprintf(f, "r%2.2d=%8.8x ", i, env->regs[i]); 3140 cpu_fprintf(f, "r%2.2d=%8.8x ", i, env->regs[i]);
@@ -3049,38 +3182,40 @@ CPUCRISState *cpu_cris_init (const char *cpu_model) @@ -3049,38 +3182,40 @@ CPUCRISState *cpu_cris_init (const char *cpu_model)
3049 cpu_T[1] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG2, "T1"); 3182 cpu_T[1] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG2, "T1");
3050 #endif 3183 #endif
3051 3184
3052 - cc_src = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0, 3185 + cc_x = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
  3186 + offsetof(CPUState, cc_x), "cc_x");
  3187 + cc_src = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
3053 offsetof(CPUState, cc_src), "cc_src"); 3188 offsetof(CPUState, cc_src), "cc_src");
3054 - cc_dest = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,  
3055 - offsetof(CPUState, cc_dest), 3189 + cc_dest = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
  3190 + offsetof(CPUState, cc_dest),
3056 "cc_dest"); 3191 "cc_dest");
3057 - cc_result = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,  
3058 - offsetof(CPUState, cc_result), 3192 + cc_result = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
  3193 + offsetof(CPUState, cc_result),
3059 "cc_result"); 3194 "cc_result");
3060 - cc_op = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0, 3195 + cc_op = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
3061 offsetof(CPUState, cc_op), "cc_op"); 3196 offsetof(CPUState, cc_op), "cc_op");
3062 - cc_size = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,  
3063 - offsetof(CPUState, cc_size), 3197 + cc_size = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
  3198 + offsetof(CPUState, cc_size),
3064 "cc_size"); 3199 "cc_size");
3065 - cc_mask = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0, 3200 + cc_mask = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
3066 offsetof(CPUState, cc_mask), 3201 offsetof(CPUState, cc_mask),
3067 "cc_mask"); 3202 "cc_mask");
3068 3203
3069 env_pc = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0, 3204 env_pc = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
3070 - offsetof(CPUState, pc),  
3071 - "pc");  
3072 - env_btarget = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,  
3073 - offsetof(CPUState, btarget),  
3074 - "btarget"); 3205 + offsetof(CPUState, pc),
  3206 + "pc");
  3207 + env_btarget = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
  3208 + offsetof(CPUState, btarget),
  3209 + "btarget");
3075 3210
3076 for (i = 0; i < 16; i++) { 3211 for (i = 0; i < 16; i++) {
3077 - cpu_R[i] = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,  
3078 - offsetof(CPUState, regs[i]), 3212 + cpu_R[i] = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
  3213 + offsetof(CPUState, regs[i]),
3079 regnames[i]); 3214 regnames[i]);
3080 } 3215 }
3081 for (i = 0; i < 16; i++) { 3216 for (i = 0; i < 16; i++) {
3082 - cpu_PR[i] = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,  
3083 - offsetof(CPUState, pregs[i]), 3217 + cpu_PR[i] = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
  3218 + offsetof(CPUState, pregs[i]),
3084 pregnames[i]); 3219 pregnames[i]);
3085 } 3220 }
3086 3221
@@ -3089,7 +3224,6 @@ CPUCRISState *cpu_cris_init (const char *cpu_model) @@ -3089,7 +3224,6 @@ CPUCRISState *cpu_cris_init (const char *cpu_model)
3089 TCG_HELPER(helper_dump); 3224 TCG_HELPER(helper_dump);
3090 TCG_HELPER(helper_dummy); 3225 TCG_HELPER(helper_dummy);
3091 3226
3092 - TCG_HELPER(helper_tlb_flush);  
3093 TCG_HELPER(helper_tlb_flush_pid); 3227 TCG_HELPER(helper_tlb_flush_pid);
3094 TCG_HELPER(helper_movl_sreg_reg); 3228 TCG_HELPER(helper_movl_sreg_reg);
3095 TCG_HELPER(helper_movl_reg_sreg); 3229 TCG_HELPER(helper_movl_reg_sreg);
@@ -3102,6 +3236,7 @@ CPUCRISState *cpu_cris_init (const char *cpu_model) @@ -3102,6 +3236,7 @@ CPUCRISState *cpu_cris_init (const char *cpu_model)
3102 TCG_HELPER(helper_evaluate_flags_move_4); 3236 TCG_HELPER(helper_evaluate_flags_move_4);
3103 TCG_HELPER(helper_evaluate_flags_move_2); 3237 TCG_HELPER(helper_evaluate_flags_move_2);
3104 TCG_HELPER(helper_evaluate_flags); 3238 TCG_HELPER(helper_evaluate_flags);
  3239 + TCG_HELPER(helper_top_evaluate_flags);
3105 3240
3106 cpu_reset(env); 3241 cpu_reset(env);
3107 return env; 3242 return env;