Commit 3761035f2c22badf220747c5734d85a922c53258

Authored by aurel32
1 parent 496cb5b9

alpha: directly access ir registers

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5151 c046a42c-6fe2-441c-8c8c-71466251a162
target-alpha/op_template.h
@@ -20,11 +20,6 @@ @@ -20,11 +20,6 @@
20 20
21 /* Optimized constant loads */ 21 /* Optimized constant loads */
22 #if REG < 3 22 #if REG < 3
23 -void OPPROTO glue(op_reset_T, REG) (void)  
24 -{  
25 - glue(T, REG) = 0;  
26 - RETURN();  
27 -}  
28 23
29 #if !defined(HOST_SPARC) && !defined(HOST_SPARC64) 24 #if !defined(HOST_SPARC) && !defined(HOST_SPARC64)
30 void OPPROTO glue(op_reset_FT, REG) (void) 25 void OPPROTO glue(op_reset_FT, REG) (void)
@@ -40,87 +35,10 @@ void OPPROTO glue(op_reset_FT, REG) (void) @@ -40,87 +35,10 @@ void OPPROTO glue(op_reset_FT, REG) (void)
40 } 35 }
41 #endif 36 #endif
42 37
43 -/* XXX: This can be great on most RISC machines */  
44 -#if !defined(__i386__) && !defined(__x86_64__)  
45 -void OPPROTO glue(op_set_s16_T, REG) (void)  
46 -{  
47 - glue(T, REG) = (int16_t)PARAM(1);  
48 - RETURN();  
49 -}  
50 -  
51 -void OPPROTO glue(op_set_u16_T, REG) (void)  
52 -{  
53 - glue(T, REG) = (uint16_t)PARAM(1);  
54 - RETURN();  
55 -}  
56 -#endif  
57 -  
58 -void OPPROTO glue(op_set_s32_T, REG) (void)  
59 -{  
60 - glue(T, REG) = (int32_t)PARAM(1);  
61 - RETURN();  
62 -}  
63 -  
64 -void OPPROTO glue(op_set_u32_T, REG) (void)  
65 -{  
66 - glue(T, REG) = (uint32_t)PARAM(1);  
67 - RETURN();  
68 -}  
69 -  
70 -#if 0 // Qemu does not know how to do this...  
71 -void OPPROTO glue(op_set_64_T, REG) (void)  
72 -{  
73 - glue(T, REG) = (int64_t)PARAM(1);  
74 - RETURN();  
75 -}  
76 -#else  
77 -void OPPROTO glue(op_set_64_T, REG) (void)  
78 -{  
79 - glue(T, REG) = ((int64_t)PARAM(1) << 32) | (int64_t)PARAM(2);  
80 - RETURN();  
81 -}  
82 -#endif  
83 -  
84 #endif /* REG < 3 */ 38 #endif /* REG < 3 */
85 39
86 /* Fixed-point register moves */ 40 /* Fixed-point register moves */
87 #if REG < 31 41 #if REG < 31
88 -void OPPROTO glue(op_load_T0_ir, REG) (void)  
89 -{  
90 - T0 = env->ir[REG];  
91 - RETURN();  
92 -}  
93 -  
94 -void OPPROTO glue(op_load_T1_ir, REG) (void)  
95 -{  
96 - T1 = env->ir[REG];  
97 - RETURN();  
98 -}  
99 -  
100 -void OPPROTO glue(op_load_T2_ir, REG) (void)  
101 -{  
102 - T2 = env->ir[REG];  
103 - RETURN();  
104 -}  
105 -  
106 -void OPPROTO glue(op_store_T0_ir, REG) (void)  
107 -{  
108 - env->ir[REG] = T0;  
109 - RETURN();  
110 -}  
111 -  
112 -void OPPROTO glue(op_store_T1_ir, REG) (void)  
113 -{  
114 - env->ir[REG] = T1;  
115 - RETURN();  
116 -}  
117 -  
118 -void OPPROTO glue(op_store_T2_ir, REG) (void)  
119 -{  
120 - env->ir[REG] = T2;  
121 - RETURN();  
122 -}  
123 -  
124 void OPPROTO glue(op_cmov_ir, REG) (void) 42 void OPPROTO glue(op_cmov_ir, REG) (void)
125 { 43 {
126 if (T0) 44 if (T0)
target-alpha/translate.c
@@ -44,10 +44,15 @@ struct DisasContext { @@ -44,10 +44,15 @@ struct DisasContext {
44 uint32_t amask; 44 uint32_t amask;
45 }; 45 };
46 46
  47 +/* global register indexes */
47 static TCGv cpu_env; 48 static TCGv cpu_env;
48 static TCGv cpu_ir[31]; 49 static TCGv cpu_ir[31];
49 static TCGv cpu_pc; 50 static TCGv cpu_pc;
50 51
  52 +/* dyngen register indexes */
  53 +static TCGv cpu_T[3];
  54 +
  55 +/* register names */
51 static char cpu_reg_names[5*31]; 56 static char cpu_reg_names[5*31];
52 57
53 #include "gen-icount.h" 58 #include "gen-icount.h"
@@ -63,6 +68,19 @@ static void alpha_translate_init(void) @@ -63,6 +68,19 @@ static void alpha_translate_init(void)
63 68
64 cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); 69 cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
65 70
  71 +#if TARGET_LONG_BITS > HOST_LONG_BITS
  72 + cpu_T[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
  73 + offsetof(CPUState, t0), "T0");
  74 + cpu_T[1] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
  75 + offsetof(CPUState, t1), "T1");
  76 + cpu_T[2] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
  77 + offsetof(CPUState, t2), "T2");
  78 +#else
  79 + cpu_T[0] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG1, "T0");
  80 + cpu_T[1] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG2, "T1");
  81 + cpu_T[2] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG3, "T2");
  82 +#endif
  83 +
66 p = cpu_reg_names; 84 p = cpu_reg_names;
67 for (i = 0; i < 31; i++) { 85 for (i = 0; i < 31; i++) {
68 sprintf(p, "ir%d", i); 86 sprintf(p, "ir%d", i);
@@ -107,65 +125,9 @@ static always_inline void func (int n) \ @@ -107,65 +125,9 @@ static always_inline void func (int n) \
107 125
108 /* IR moves */ 126 /* IR moves */
109 /* Special hacks for ir31 */ 127 /* Special hacks for ir31 */
110 -#define gen_op_load_T0_ir31 gen_op_reset_T0  
111 -#define gen_op_load_T1_ir31 gen_op_reset_T1  
112 -#define gen_op_load_T2_ir31 gen_op_reset_T2  
113 -#define gen_op_store_T0_ir31 gen_op_nop  
114 -#define gen_op_store_T1_ir31 gen_op_nop  
115 -#define gen_op_store_T2_ir31 gen_op_nop  
116 #define gen_op_cmov_ir31 gen_op_nop 128 #define gen_op_cmov_ir31 gen_op_nop
117 -GEN32(gen_op_load_T0_ir, gen_op_load_T0_ir);  
118 -GEN32(gen_op_load_T1_ir, gen_op_load_T1_ir);  
119 -GEN32(gen_op_load_T2_ir, gen_op_load_T2_ir);  
120 -GEN32(gen_op_store_T0_ir, gen_op_store_T0_ir);  
121 -GEN32(gen_op_store_T1_ir, gen_op_store_T1_ir);  
122 -GEN32(gen_op_store_T2_ir, gen_op_store_T2_ir);  
123 GEN32(gen_op_cmov_ir, gen_op_cmov_ir); 129 GEN32(gen_op_cmov_ir, gen_op_cmov_ir);
124 130
125 -static always_inline void gen_load_ir (DisasContext *ctx, int irn, int Tn)  
126 -{  
127 - switch (Tn) {  
128 - case 0:  
129 - gen_op_load_T0_ir(irn);  
130 - break;  
131 - case 1:  
132 - gen_op_load_T1_ir(irn);  
133 - break;  
134 - case 2:  
135 - gen_op_load_T2_ir(irn);  
136 - break;  
137 - }  
138 -}  
139 -  
140 -static always_inline void gen_store_ir (DisasContext *ctx, int irn, int Tn)  
141 -{  
142 - switch (Tn) {  
143 - case 0:  
144 - gen_op_store_T0_ir(irn);  
145 - break;  
146 - case 1:  
147 - gen_op_store_T1_ir(irn);  
148 - break;  
149 - case 2:  
150 - gen_op_store_T2_ir(irn);  
151 - break;  
152 - }  
153 -}  
154 -  
155 -static inline void get_ir (TCGv t, int reg)  
156 -{  
157 - if (reg == 31)  
158 - tcg_gen_movi_i64(t, 0);  
159 - else  
160 - tcg_gen_mov_i64(t, cpu_ir[reg]);  
161 -}  
162 -  
163 -static inline void set_ir (TCGv t, int reg)  
164 -{  
165 - if (reg != 31)  
166 - tcg_gen_mov_i64(cpu_ir[reg], t);  
167 -}  
168 -  
169 /* FIR moves */ 131 /* FIR moves */
170 /* Special hacks for fir31 */ 132 /* Special hacks for fir31 */
171 #define gen_op_load_FT0_fir31 gen_op_reset_FT0 133 #define gen_op_load_FT0_fir31 gen_op_reset_FT0
@@ -280,120 +242,6 @@ GEN_ST(s); @@ -280,120 +242,6 @@ GEN_ST(s);
280 GEN_LD(t); 242 GEN_LD(t);
281 GEN_ST(t); 243 GEN_ST(t);
282 244
283 -#if defined(__i386__) || defined(__x86_64__)  
284 -static always_inline void gen_op_set_s16_T0 (int16_t imm)  
285 -{  
286 - gen_op_set_s32_T0((int32_t)imm);  
287 -}  
288 -  
289 -static always_inline void gen_op_set_s16_T1 (int16_t imm)  
290 -{  
291 - gen_op_set_s32_T1((int32_t)imm);  
292 -}  
293 -  
294 -static always_inline void gen_op_set_u16_T0 (uint16_t imm)  
295 -{  
296 - gen_op_set_s32_T0((uint32_t)imm);  
297 -}  
298 -  
299 -static always_inline void gen_op_set_u16_T1 (uint16_t imm)  
300 -{  
301 - gen_op_set_s32_T1((uint32_t)imm);  
302 -}  
303 -#endif  
304 -  
305 -static always_inline void gen_set_sT0 (DisasContext *ctx, int64_t imm)  
306 -{  
307 - int32_t imm32;  
308 - int16_t imm16;  
309 -  
310 - imm32 = imm;  
311 - if (imm32 == imm) {  
312 - imm16 = imm;  
313 - if (imm16 == imm) {  
314 - if (imm == 0) {  
315 - gen_op_reset_T0();  
316 - } else {  
317 - gen_op_set_s16_T0(imm16);  
318 - }  
319 - } else {  
320 - gen_op_set_s32_T0(imm32);  
321 - }  
322 - } else {  
323 -#if 0 // Qemu does not know how to do this...  
324 - gen_op_set_64_T0(imm);  
325 -#else  
326 - gen_op_set_64_T0(imm >> 32, imm);  
327 -#endif  
328 - }  
329 -}  
330 -  
331 -static always_inline void gen_set_sT1 (DisasContext *ctx, int64_t imm)  
332 -{  
333 - int32_t imm32;  
334 - int16_t imm16;  
335 -  
336 - imm32 = imm;  
337 - if (imm32 == imm) {  
338 - imm16 = imm;  
339 - if (imm16 == imm) {  
340 - if (imm == 0) {  
341 - gen_op_reset_T1();  
342 - } else {  
343 - gen_op_set_s16_T1(imm16);  
344 - }  
345 - } else {  
346 - gen_op_set_s32_T1(imm32);  
347 - }  
348 - } else {  
349 -#if 0 // Qemu does not know how to do this...  
350 - gen_op_set_64_T1(imm);  
351 -#else  
352 - gen_op_set_64_T1(imm >> 32, imm);  
353 -#endif  
354 - }  
355 -}  
356 -  
357 -static always_inline void gen_set_uT0 (DisasContext *ctx, uint64_t imm)  
358 -{  
359 - if (!(imm >> 32)) {  
360 - if ((!imm >> 16)) {  
361 - if (imm == 0)  
362 - gen_op_reset_T0();  
363 - else  
364 - gen_op_set_u16_T0(imm);  
365 - } else {  
366 - gen_op_set_u32_T0(imm);  
367 - }  
368 - } else {  
369 -#if 0 // Qemu does not know how to do this...  
370 - gen_op_set_64_T0(imm);  
371 -#else  
372 - gen_op_set_64_T0(imm >> 32, imm);  
373 -#endif  
374 - }  
375 -}  
376 -  
377 -static always_inline void gen_set_uT1 (DisasContext *ctx, uint64_t imm)  
378 -{  
379 - if (!(imm >> 32)) {  
380 - if ((!imm >> 16)) {  
381 - if (imm == 0)  
382 - gen_op_reset_T1();  
383 - else  
384 - gen_op_set_u16_T1(imm);  
385 - } else {  
386 - gen_op_set_u32_T1(imm);  
387 - }  
388 - } else {  
389 -#if 0 // Qemu does not know how to do this...  
390 - gen_op_set_64_T1(imm);  
391 -#else  
392 - gen_op_set_64_T1(imm >> 32, imm);  
393 -#endif  
394 - }  
395 -}  
396 -  
397 static always_inline void _gen_op_bcond (DisasContext *ctx) 245 static always_inline void _gen_op_bcond (DisasContext *ctx)
398 { 246 {
399 #if 0 // Qemu does not know how to do this... 247 #if 0 // Qemu does not know how to do this...
@@ -424,15 +272,19 @@ static always_inline void gen_load_mem (DisasContext *ctx, @@ -424,15 +272,19 @@ static always_inline void gen_load_mem (DisasContext *ctx,
424 /* UNOP */ 272 /* UNOP */
425 gen_op_nop(); 273 gen_op_nop();
426 } else { 274 } else {
427 - gen_load_ir(ctx, rb, 0); 275 + if (rb != 31)
  276 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
  277 + else
  278 + tcg_gen_movi_i64(cpu_T[0], 0);
428 if (disp16 != 0) { 279 if (disp16 != 0) {
429 - gen_set_sT1(ctx, disp16); 280 + tcg_gen_movi_i64(cpu_T[1], disp16);
430 gen_op_addq(); 281 gen_op_addq();
431 } 282 }
432 if (clear) 283 if (clear)
433 gen_op_n7(); 284 gen_op_n7();
434 (*gen_load_op)(ctx); 285 (*gen_load_op)(ctx);
435 - gen_store_ir(ctx, ra, 1); 286 + if (ra != 31)
  287 + tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
436 } 288 }
437 } 289 }
438 290
@@ -441,14 +293,20 @@ static always_inline void gen_store_mem (DisasContext *ctx, @@ -441,14 +293,20 @@ static always_inline void gen_store_mem (DisasContext *ctx,
441 int ra, int rb, int32_t disp16, 293 int ra, int rb, int32_t disp16,
442 int clear) 294 int clear)
443 { 295 {
444 - gen_load_ir(ctx, rb, 0); 296 + if (rb != 31)
  297 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
  298 + else
  299 + tcg_gen_movi_i64(cpu_T[0], 0);
445 if (disp16 != 0) { 300 if (disp16 != 0) {
446 - gen_set_sT1(ctx, disp16); 301 + tcg_gen_movi_i64(cpu_T[1], disp16);
447 gen_op_addq(); 302 gen_op_addq();
448 } 303 }
449 if (clear) 304 if (clear)
450 gen_op_n7(); 305 gen_op_n7();
451 - gen_load_ir(ctx, ra, 1); 306 + if (ra != 31)
  307 + tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
  308 + else
  309 + tcg_gen_movi_i64(cpu_T[1], 0);
452 (*gen_store_op)(ctx); 310 (*gen_store_op)(ctx);
453 } 311 }
454 312
@@ -456,9 +314,12 @@ static always_inline void gen_load_fmem (DisasContext *ctx, @@ -456,9 +314,12 @@ static always_inline void gen_load_fmem (DisasContext *ctx,
456 void (*gen_load_fop)(DisasContext *ctx), 314 void (*gen_load_fop)(DisasContext *ctx),
457 int ra, int rb, int32_t disp16) 315 int ra, int rb, int32_t disp16)
458 { 316 {
459 - gen_load_ir(ctx, rb, 0); 317 + if (rb != 31)
  318 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
  319 + else
  320 + tcg_gen_movi_i64(cpu_T[0], 0);
460 if (disp16 != 0) { 321 if (disp16 != 0) {
461 - gen_set_sT1(ctx, disp16); 322 + tcg_gen_movi_i64(cpu_T[1], disp16);
462 gen_op_addq(); 323 gen_op_addq();
463 } 324 }
464 (*gen_load_fop)(ctx); 325 (*gen_load_fop)(ctx);
@@ -469,9 +330,12 @@ static always_inline void gen_store_fmem (DisasContext *ctx, @@ -469,9 +330,12 @@ static always_inline void gen_store_fmem (DisasContext *ctx,
469 void (*gen_store_fop)(DisasContext *ctx), 330 void (*gen_store_fop)(DisasContext *ctx),
470 int ra, int rb, int32_t disp16) 331 int ra, int rb, int32_t disp16)
471 { 332 {
472 - gen_load_ir(ctx, rb, 0); 333 + if (rb != 31)
  334 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
  335 + else
  336 + tcg_gen_movi_i64(cpu_T[0], 0);
473 if (disp16 != 0) { 337 if (disp16 != 0) {
474 - gen_set_sT1(ctx, disp16); 338 + tcg_gen_movi_i64(cpu_T[1], disp16);
475 gen_op_addq(); 339 gen_op_addq();
476 } 340 }
477 gen_load_fir(ctx, ra, 1); 341 gen_load_fir(ctx, ra, 1);
@@ -483,13 +347,16 @@ static always_inline void gen_bcond (DisasContext *ctx, @@ -483,13 +347,16 @@ static always_inline void gen_bcond (DisasContext *ctx,
483 int ra, int32_t disp16) 347 int ra, int32_t disp16)
484 { 348 {
485 if (disp16 != 0) { 349 if (disp16 != 0) {
486 - gen_set_uT0(ctx, ctx->pc);  
487 - gen_set_sT1(ctx, disp16 << 2); 350 + tcg_gen_movi_i64(cpu_T[0], ctx->pc);
  351 + tcg_gen_movi_i64(cpu_T[1], disp16 << 2);
488 gen_op_addq1(); 352 gen_op_addq1();
489 } else { 353 } else {
490 - gen_set_uT1(ctx, ctx->pc); 354 + tcg_gen_movi_i64(cpu_T[1], ctx->pc);
491 } 355 }
492 - gen_load_ir(ctx, ra, 0); 356 + if (ra != 31)
  357 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
  358 + else
  359 + tcg_gen_movi_i64(cpu_T[0], 0);
493 (*gen_test_op)(); 360 (*gen_test_op)();
494 _gen_op_bcond(ctx); 361 _gen_op_bcond(ctx);
495 } 362 }
@@ -499,11 +366,11 @@ static always_inline void gen_fbcond (DisasContext *ctx, @@ -499,11 +366,11 @@ static always_inline void gen_fbcond (DisasContext *ctx,
499 int ra, int32_t disp16) 366 int ra, int32_t disp16)
500 { 367 {
501 if (disp16 != 0) { 368 if (disp16 != 0) {
502 - gen_set_uT0(ctx, ctx->pc);  
503 - gen_set_sT1(ctx, disp16 << 2); 369 + tcg_gen_movi_i64(cpu_T[0], ctx->pc);
  370 + tcg_gen_movi_i64(cpu_T[1], disp16 << 2);
504 gen_op_addq1(); 371 gen_op_addq1();
505 } else { 372 } else {
506 - gen_set_uT1(ctx, ctx->pc); 373 + tcg_gen_movi_i64(cpu_T[1], ctx->pc);
507 } 374 }
508 gen_load_fir(ctx, ra, 0); 375 gen_load_fir(ctx, ra, 0);
509 (*gen_test_op)(); 376 (*gen_test_op)();
@@ -515,11 +382,14 @@ static always_inline void gen_arith2 (DisasContext *ctx, @@ -515,11 +382,14 @@ static always_inline void gen_arith2 (DisasContext *ctx,
515 int rb, int rc, int islit, int8_t lit) 382 int rb, int rc, int islit, int8_t lit)
516 { 383 {
517 if (islit) 384 if (islit)
518 - gen_set_sT0(ctx, lit); 385 + tcg_gen_movi_i64(cpu_T[0], lit);
  386 + else if (rb != 31)
  387 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
519 else 388 else
520 - gen_load_ir(ctx, rb, 0); 389 + tcg_gen_movi_i64(cpu_T[0], 0);
521 (*gen_arith_op)(); 390 (*gen_arith_op)();
522 - gen_store_ir(ctx, rc, 0); 391 + if (rc != 31)
  392 + tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
523 } 393 }
524 394
525 static always_inline void gen_arith3 (DisasContext *ctx, 395 static always_inline void gen_arith3 (DisasContext *ctx,
@@ -527,13 +397,19 @@ static always_inline void gen_arith3 (DisasContext *ctx, @@ -527,13 +397,19 @@ static always_inline void gen_arith3 (DisasContext *ctx,
527 int ra, int rb, int rc, 397 int ra, int rb, int rc,
528 int islit, int8_t lit) 398 int islit, int8_t lit)
529 { 399 {
530 - gen_load_ir(ctx, ra, 0); 400 + if (ra != 31)
  401 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
  402 + else
  403 + tcg_gen_movi_i64(cpu_T[0], 0);
531 if (islit) 404 if (islit)
532 - gen_set_sT1(ctx, lit); 405 + tcg_gen_movi_i64(cpu_T[1], lit);
  406 + else if (rb != 31)
  407 + tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
533 else 408 else
534 - gen_load_ir(ctx, rb, 1); 409 + tcg_gen_movi_i64(cpu_T[1], 0);
535 (*gen_arith_op)(); 410 (*gen_arith_op)();
536 - gen_store_ir(ctx, rc, 0); 411 + if (rc != 31)
  412 + tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
537 } 413 }
538 414
539 static always_inline void gen_cmov (DisasContext *ctx, 415 static always_inline void gen_cmov (DisasContext *ctx,
@@ -541,11 +417,16 @@ static always_inline void gen_cmov (DisasContext *ctx, @@ -541,11 +417,16 @@ static always_inline void gen_cmov (DisasContext *ctx,
541 int ra, int rb, int rc, 417 int ra, int rb, int rc,
542 int islit, int8_t lit) 418 int islit, int8_t lit)
543 { 419 {
544 - gen_load_ir(ctx, ra, 1); 420 + if (ra != 31)
  421 + tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
  422 + else
  423 + tcg_gen_movi_i64(cpu_T[1], 0);
545 if (islit) 424 if (islit)
546 - gen_set_sT0(ctx, lit); 425 + tcg_gen_movi_i64(cpu_T[0], lit);
  426 + else if (rb != 31)
  427 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
547 else 428 else
548 - gen_load_ir(ctx, rb, 0); 429 + tcg_gen_movi_i64(cpu_T[0], 0);
549 (*gen_test_op)(); 430 (*gen_test_op)();
550 gen_op_cmov_ir(rc); 431 gen_op_cmov_ir(rc);
551 } 432 }
@@ -585,14 +466,18 @@ static always_inline void gen_fti (DisasContext *ctx, @@ -585,14 +466,18 @@ static always_inline void gen_fti (DisasContext *ctx,
585 { 466 {
586 gen_load_fir(ctx, rc, 0); 467 gen_load_fir(ctx, rc, 0);
587 (*gen_move_fop)(); 468 (*gen_move_fop)();
588 - gen_store_ir(ctx, ra, 0); 469 + if (ra != 31)
  470 + tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
589 } 471 }
590 472
591 static always_inline void gen_itf (DisasContext *ctx, 473 static always_inline void gen_itf (DisasContext *ctx,
592 void (*gen_move_fop)(void), 474 void (*gen_move_fop)(void),
593 int ra, int rc) 475 int ra, int rc)
594 { 476 {
595 - gen_load_ir(ctx, ra, 0); 477 + if (ra != 31)
  478 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
  479 + else
  480 + tcg_gen_movi_i64(cpu_T[0], 0);
596 (*gen_move_fop)(); 481 (*gen_move_fop)();
597 gen_store_fir(ctx, rc, 0); 482 gen_store_fir(ctx, rc, 0);
598 } 483 }
@@ -727,22 +612,20 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -727,22 +612,20 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
727 goto invalid_opc; 612 goto invalid_opc;
728 case 0x08: 613 case 0x08:
729 /* LDA */ 614 /* LDA */
730 - {  
731 - TCGv v = tcg_const_i64(disp16); 615 + if (ra != 31) {
732 if (rb != 31) 616 if (rb != 31)
733 - tcg_gen_add_i64(v, cpu_ir[rb], v);  
734 - set_ir(v, ra);  
735 - tcg_temp_free(v); 617 + tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16);
  618 + else
  619 + tcg_gen_movi_i64(cpu_ir[ra], disp16);
736 } 620 }
737 break; 621 break;
738 case 0x09: 622 case 0x09:
739 /* LDAH */ 623 /* LDAH */
740 - {  
741 - TCGv v = tcg_const_i64(disp16 << 16); 624 + if (ra != 31) {
742 if (rb != 31) 625 if (rb != 31)
743 - tcg_gen_add_i64(v, cpu_ir[rb], v);  
744 - set_ir(v, ra);  
745 - tcg_temp_free(v); 626 + tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16 << 16);
  627 + else
  628 + tcg_gen_movi_i64(cpu_ir[ra], disp16 << 16);
746 } 629 }
747 break; 630 break;
748 case 0x0A: 631 case 0x0A:
@@ -897,8 +780,12 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -897,8 +780,12 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
897 gen_op_nop(); 780 gen_op_nop();
898 } else { 781 } else {
899 /* MOV */ 782 /* MOV */
900 - gen_load_ir(ctx, rb, 0);  
901 - gen_store_ir(ctx, rc, 0); 783 + if (rc != 31) {
  784 + if (rb != 31)
  785 + tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
  786 + else
  787 + tcg_gen_movi_i64(cpu_ir[rc], 0);
  788 + }
902 } 789 }
903 } else { 790 } else {
904 gen_arith3(ctx, &gen_op_bis, ra, rb, rc, islit, lit); 791 gen_arith3(ctx, &gen_op_bis, ra, rb, rc, islit, lit);
@@ -947,7 +834,8 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -947,7 +834,8 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
947 case 0x6C: 834 case 0x6C:
948 /* IMPLVER */ 835 /* IMPLVER */
949 gen_op_load_implver(); 836 gen_op_load_implver();
950 - gen_store_ir(ctx, rc, 0); 837 + if (rc != 31)
  838 + tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
951 break; 839 break;
952 default: 840 default:
953 goto invalid_opc; 841 goto invalid_opc;
@@ -1413,12 +1301,14 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1413,12 +1301,14 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1413 case 0xC000: 1301 case 0xC000:
1414 /* RPCC */ 1302 /* RPCC */
1415 gen_op_load_pcc(); 1303 gen_op_load_pcc();
1416 - gen_store_ir(ctx, ra, 0); 1304 + if (ra != 31)
  1305 + tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1417 break; 1306 break;
1418 case 0xE000: 1307 case 0xE000:
1419 /* RC */ 1308 /* RC */
1420 gen_op_load_irf(); 1309 gen_op_load_irf();
1421 - gen_store_ir(ctx, ra, 0); 1310 + if (ra != 31)
  1311 + tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1422 gen_op_clear_irf(); 1312 gen_op_clear_irf();
1423 break; 1313 break;
1424 case 0xE800: 1314 case 0xE800:
@@ -1433,7 +1323,8 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1433,7 +1323,8 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1433 case 0xF000: 1323 case 0xF000:
1434 /* RS */ 1324 /* RS */
1435 gen_op_load_irf(); 1325 gen_op_load_irf();
1436 - gen_store_ir(ctx, ra, 0); 1326 + if (ra != 31)
  1327 + tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1437 gen_op_set_irf(); 1328 gen_op_set_irf();
1438 break; 1329 break;
1439 case 0xF800: 1330 case 0xF800:
@@ -1452,16 +1343,17 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1452,16 +1343,17 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1452 if (!ctx->pal_mode) 1343 if (!ctx->pal_mode)
1453 goto invalid_opc; 1344 goto invalid_opc;
1454 gen_op_mfpr(insn & 0xFF); 1345 gen_op_mfpr(insn & 0xFF);
1455 - gen_store_ir(ctx, ra, 0); 1346 + if (ra != 31)
  1347 + tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1456 break; 1348 break;
1457 #endif 1349 #endif
1458 case 0x1A: 1350 case 0x1A:
1459 - gen_load_ir(ctx, rb, 0);  
1460 - if (ra != 31) {  
1461 - gen_set_uT1(ctx, ctx->pc);  
1462 - gen_store_ir(ctx, ra, 1);  
1463 - }  
1464 - gen_op_branch(); 1351 + if (ra != 31)
  1352 + tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
  1353 + if (rb != 31)
  1354 + tcg_gen_andi_i64(cpu_pc, cpu_ir[rb], ~3);
  1355 + else
  1356 + tcg_gen_movi_i64(cpu_pc, 0);
1465 /* Those four jumps only differ by the branch prediction hint */ 1357 /* Those four jumps only differ by the branch prediction hint */
1466 switch (fn2) { 1358 switch (fn2) {
1467 case 0x0: 1359 case 0x0:
@@ -1486,8 +1378,11 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1486,8 +1378,11 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1486 #else 1378 #else
1487 if (!ctx->pal_mode) 1379 if (!ctx->pal_mode)
1488 goto invalid_opc; 1380 goto invalid_opc;
1489 - gen_load_ir(ctx, rb, 0);  
1490 - gen_set_sT1(ctx, disp12); 1381 + if (rb != 31)
  1382 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
  1383 + else
  1384 + tcg_gen_movi_i64(cpu_T[0], 0);
  1385 + tcg_gen_movi_i64(cpu_T[1], disp12);
1491 gen_op_addq(); 1386 gen_op_addq();
1492 switch ((insn >> 12) & 0xF) { 1387 switch ((insn >> 12) & 0xF) {
1493 case 0x0: 1388 case 0x0:
@@ -1569,7 +1464,8 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1569,7 +1464,8 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1569 gen_op_restore_mode(); 1464 gen_op_restore_mode();
1570 break; 1465 break;
1571 } 1466 }
1572 - gen_store_ir(ctx, ra, 1); 1467 + if (ra != 31)
  1468 + tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
1573 break; 1469 break;
1574 #endif 1470 #endif
1575 case 0x1C: 1471 case 0x1C:
@@ -1718,7 +1614,10 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1718,7 +1614,10 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1718 #else 1614 #else
1719 if (!ctx->pal_mode) 1615 if (!ctx->pal_mode)
1720 goto invalid_opc; 1616 goto invalid_opc;
1721 - gen_load_ir(ctx, ra, 0); 1617 + if (ra != 31)
  1618 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
  1619 + else
  1620 + tcg_gen_movi_i64(cpu_T[0], 0);
1722 gen_op_mtpr(insn & 0xFF); 1621 gen_op_mtpr(insn & 0xFF);
1723 ret = 2; 1622 ret = 2;
1724 break; 1623 break;
@@ -1734,8 +1633,11 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1734,8 +1633,11 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1734 /* "Old" alpha */ 1633 /* "Old" alpha */
1735 gen_op_hw_rei(); 1634 gen_op_hw_rei();
1736 } else { 1635 } else {
1737 - gen_load_ir(ctx, rb, 0);  
1738 - gen_set_uT1(ctx, (((int64_t)insn << 51) >> 51)); 1636 + if (ra != 31)
  1637 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
  1638 + else
  1639 + tcg_gen_movi_i64(cpu_T[0], 0);
  1640 + tcg_gen_movi_i64(cpu_T[1], (((int64_t)insn << 51) >> 51));
1739 gen_op_addq(); 1641 gen_op_addq();
1740 gen_op_hw_ret(); 1642 gen_op_hw_ret();
1741 } 1643 }
@@ -1749,10 +1651,16 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1749,10 +1651,16 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1749 #else 1651 #else
1750 if (!ctx->pal_mode) 1652 if (!ctx->pal_mode)
1751 goto invalid_opc; 1653 goto invalid_opc;
1752 - gen_load_ir(ctx, rb, 0);  
1753 - gen_set_sT1(ctx, disp12); 1654 + if (ra != 31)
  1655 + tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
  1656 + else
  1657 + tcg_gen_movi_i64(cpu_T[0], 0);
  1658 + tcg_gen_movi_i64(cpu_T[1], disp12);
1754 gen_op_addq(); 1659 gen_op_addq();
1755 - gen_load_ir(ctx, ra, 1); 1660 + if (ra != 31)
  1661 + tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
  1662 + else
  1663 + tcg_gen_movi_i64(cpu_T[1], 0);
1756 switch ((insn >> 12) & 0xF) { 1664 switch ((insn >> 12) & 0xF) {
1757 case 0x0: 1665 case 0x0:
1758 /* Longword physical access */ 1666 /* Longword physical access */
@@ -1904,12 +1812,9 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1904,12 +1812,9 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1904 break; 1812 break;
1905 case 0x30: 1813 case 0x30:
1906 /* BR */ 1814 /* BR */
1907 - if (ra != 31) {  
1908 - TCGv t = tcg_const_i64(ctx->pc);  
1909 - set_ir(t, ra);  
1910 - tcg_temp_free(t);  
1911 - }  
1912 - tcg_gen_movi_i64(cpu_pc, ctx->pc + (disp21 << 2)); 1815 + if (ra != 31)
  1816 + tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
  1817 + tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
1913 ret = 1; 1818 ret = 1;
1914 break; 1819 break;
1915 case 0x31: 1820 case 0x31:
@@ -1929,13 +1834,9 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1929,13 +1834,9 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1929 break; 1834 break;
1930 case 0x34: 1835 case 0x34:
1931 /* BSR */ 1836 /* BSR */
1932 - gen_set_uT0(ctx, ctx->pc);  
1933 - gen_store_ir(ctx, ra, 0);  
1934 - if (disp21 != 0) {  
1935 - gen_set_sT1(ctx, disp21 << 2);  
1936 - gen_op_addq();  
1937 - }  
1938 - gen_op_branch(); 1837 + if (ra != 31)
  1838 + tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
  1839 + tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
1939 ret = 1; 1840 ret = 1;
1940 break; 1841 break;
1941 case 0x35: 1842 case 0x35: