Commit 4f821e17574896c046c11bc073c1dc636a6f15d6
1 parent
3761035f
alpha: convert a few more instructions to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5152 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
28 additions
and
90 deletions
target-alpha/op.c
@@ -148,13 +148,6 @@ void OPPROTO op_no_op (void) | @@ -148,13 +148,6 @@ void OPPROTO op_no_op (void) | ||
148 | #include "op_mem.h" | 148 | #include "op_mem.h" |
149 | #endif | 149 | #endif |
150 | 150 | ||
151 | -/* Special operation for load and store */ | ||
152 | -void OPPROTO op_n7 (void) | ||
153 | -{ | ||
154 | - T0 &= ~(uint64_t)0x7; | ||
155 | - RETURN(); | ||
156 | -} | ||
157 | - | ||
158 | /* Misc */ | 151 | /* Misc */ |
159 | void OPPROTO op_excp (void) | 152 | void OPPROTO op_excp (void) |
160 | { | 153 | { |
@@ -259,18 +252,6 @@ void OPPROTO op_sublv (void) | @@ -259,18 +252,6 @@ void OPPROTO op_sublv (void) | ||
259 | RETURN(); | 252 | RETURN(); |
260 | } | 253 | } |
261 | 254 | ||
262 | -void OPPROTO op_s4 (void) | ||
263 | -{ | ||
264 | - T0 <<= 2; | ||
265 | - RETURN(); | ||
266 | -} | ||
267 | - | ||
268 | -void OPPROTO op_s8 (void) | ||
269 | -{ | ||
270 | - T0 <<= 3; | ||
271 | - RETURN(); | ||
272 | -} | ||
273 | - | ||
274 | void OPPROTO op_mull (void) | 255 | void OPPROTO op_mull (void) |
275 | { | 256 | { |
276 | T0 = (int64_t)((int32_t)T0 * (int32_t)T1); | 257 | T0 = (int64_t)((int32_t)T0 * (int32_t)T1); |
@@ -646,19 +627,6 @@ void OPPROTO op_cmplbc (void) | @@ -646,19 +627,6 @@ void OPPROTO op_cmplbc (void) | ||
646 | RETURN(); | 627 | RETURN(); |
647 | } | 628 | } |
648 | 629 | ||
649 | -/* Branches */ | ||
650 | -void OPPROTO op_branch (void) | ||
651 | -{ | ||
652 | - env->pc = T0 & ~3; | ||
653 | - RETURN(); | ||
654 | -} | ||
655 | - | ||
656 | -void OPPROTO op_addq1 (void) | ||
657 | -{ | ||
658 | - T1 += T0; | ||
659 | - RETURN(); | ||
660 | -} | ||
661 | - | ||
662 | #if 0 // Qemu does not know how to do this... | 630 | #if 0 // Qemu does not know how to do this... |
663 | void OPPROTO op_bcond (void) | 631 | void OPPROTO op_bcond (void) |
664 | { | 632 | { |
target-alpha/translate.c
@@ -273,15 +273,11 @@ static always_inline void gen_load_mem (DisasContext *ctx, | @@ -273,15 +273,11 @@ static always_inline void gen_load_mem (DisasContext *ctx, | ||
273 | gen_op_nop(); | 273 | gen_op_nop(); |
274 | } else { | 274 | } else { |
275 | if (rb != 31) | 275 | if (rb != 31) |
276 | - tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]); | 276 | + tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16); |
277 | else | 277 | else |
278 | - tcg_gen_movi_i64(cpu_T[0], 0); | ||
279 | - if (disp16 != 0) { | ||
280 | - tcg_gen_movi_i64(cpu_T[1], disp16); | ||
281 | - gen_op_addq(); | ||
282 | - } | 278 | + tcg_gen_movi_i64(cpu_T[0], disp16); |
283 | if (clear) | 279 | if (clear) |
284 | - gen_op_n7(); | 280 | + tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7); |
285 | (*gen_load_op)(ctx); | 281 | (*gen_load_op)(ctx); |
286 | if (ra != 31) | 282 | if (ra != 31) |
287 | tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]); | 283 | tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]); |
@@ -294,15 +290,11 @@ static always_inline void gen_store_mem (DisasContext *ctx, | @@ -294,15 +290,11 @@ static always_inline void gen_store_mem (DisasContext *ctx, | ||
294 | int clear) | 290 | int clear) |
295 | { | 291 | { |
296 | if (rb != 31) | 292 | if (rb != 31) |
297 | - tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]); | 293 | + tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16); |
298 | else | 294 | else |
299 | - tcg_gen_movi_i64(cpu_T[0], 0); | ||
300 | - if (disp16 != 0) { | ||
301 | - tcg_gen_movi_i64(cpu_T[1], disp16); | ||
302 | - gen_op_addq(); | ||
303 | - } | 295 | + tcg_gen_movi_i64(cpu_T[0], disp16); |
304 | if (clear) | 296 | if (clear) |
305 | - gen_op_n7(); | 297 | + tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7); |
306 | if (ra != 31) | 298 | if (ra != 31) |
307 | tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]); | 299 | tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]); |
308 | else | 300 | else |
@@ -315,13 +307,9 @@ static always_inline void gen_load_fmem (DisasContext *ctx, | @@ -315,13 +307,9 @@ static always_inline void gen_load_fmem (DisasContext *ctx, | ||
315 | int ra, int rb, int32_t disp16) | 307 | int ra, int rb, int32_t disp16) |
316 | { | 308 | { |
317 | if (rb != 31) | 309 | if (rb != 31) |
318 | - tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]); | 310 | + tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16); |
319 | else | 311 | else |
320 | - tcg_gen_movi_i64(cpu_T[0], 0); | ||
321 | - if (disp16 != 0) { | ||
322 | - tcg_gen_movi_i64(cpu_T[1], disp16); | ||
323 | - gen_op_addq(); | ||
324 | - } | 312 | + tcg_gen_movi_i64(cpu_T[0], disp16); |
325 | (*gen_load_fop)(ctx); | 313 | (*gen_load_fop)(ctx); |
326 | gen_store_fir(ctx, ra, 1); | 314 | gen_store_fir(ctx, ra, 1); |
327 | } | 315 | } |
@@ -331,13 +319,9 @@ static always_inline void gen_store_fmem (DisasContext *ctx, | @@ -331,13 +319,9 @@ static always_inline void gen_store_fmem (DisasContext *ctx, | ||
331 | int ra, int rb, int32_t disp16) | 319 | int ra, int rb, int32_t disp16) |
332 | { | 320 | { |
333 | if (rb != 31) | 321 | if (rb != 31) |
334 | - tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]); | 322 | + tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16); |
335 | else | 323 | else |
336 | - tcg_gen_movi_i64(cpu_T[0], 0); | ||
337 | - if (disp16 != 0) { | ||
338 | - tcg_gen_movi_i64(cpu_T[1], disp16); | ||
339 | - gen_op_addq(); | ||
340 | - } | 324 | + tcg_gen_movi_i64(cpu_T[0], disp16); |
341 | gen_load_fir(ctx, ra, 1); | 325 | gen_load_fir(ctx, ra, 1); |
342 | (*gen_store_fop)(ctx); | 326 | (*gen_store_fop)(ctx); |
343 | } | 327 | } |
@@ -346,13 +330,7 @@ static always_inline void gen_bcond (DisasContext *ctx, | @@ -346,13 +330,7 @@ static always_inline void gen_bcond (DisasContext *ctx, | ||
346 | void (*gen_test_op)(void), | 330 | void (*gen_test_op)(void), |
347 | int ra, int32_t disp16) | 331 | int ra, int32_t disp16) |
348 | { | 332 | { |
349 | - if (disp16 != 0) { | ||
350 | - tcg_gen_movi_i64(cpu_T[0], ctx->pc); | ||
351 | - tcg_gen_movi_i64(cpu_T[1], disp16 << 2); | ||
352 | - gen_op_addq1(); | ||
353 | - } else { | ||
354 | - tcg_gen_movi_i64(cpu_T[1], ctx->pc); | ||
355 | - } | 333 | + tcg_gen_movi_i64(cpu_T[1], ctx->pc + (int64_t)(disp16 << 2)); |
356 | if (ra != 31) | 334 | if (ra != 31) |
357 | tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]); | 335 | tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]); |
358 | else | 336 | else |
@@ -365,13 +343,7 @@ static always_inline void gen_fbcond (DisasContext *ctx, | @@ -365,13 +343,7 @@ static always_inline void gen_fbcond (DisasContext *ctx, | ||
365 | void (*gen_test_op)(void), | 343 | void (*gen_test_op)(void), |
366 | int ra, int32_t disp16) | 344 | int ra, int32_t disp16) |
367 | { | 345 | { |
368 | - if (disp16 != 0) { | ||
369 | - tcg_gen_movi_i64(cpu_T[0], ctx->pc); | ||
370 | - tcg_gen_movi_i64(cpu_T[1], disp16 << 2); | ||
371 | - gen_op_addq1(); | ||
372 | - } else { | ||
373 | - tcg_gen_movi_i64(cpu_T[1], ctx->pc); | ||
374 | - } | 346 | + tcg_gen_movi_i64(cpu_T[1], ctx->pc + (int64_t)(disp16 << 2)); |
375 | gen_load_fir(ctx, ra, 0); | 347 | gen_load_fir(ctx, ra, 0); |
376 | (*gen_test_op)(); | 348 | (*gen_test_op)(); |
377 | _gen_op_bcond(ctx); | 349 | _gen_op_bcond(ctx); |
@@ -484,50 +456,50 @@ static always_inline void gen_itf (DisasContext *ctx, | @@ -484,50 +456,50 @@ static always_inline void gen_itf (DisasContext *ctx, | ||
484 | 456 | ||
485 | static always_inline void gen_s4addl (void) | 457 | static always_inline void gen_s4addl (void) |
486 | { | 458 | { |
487 | - gen_op_s4(); | 459 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 2); |
488 | gen_op_addl(); | 460 | gen_op_addl(); |
489 | } | 461 | } |
490 | 462 | ||
491 | static always_inline void gen_s4subl (void) | 463 | static always_inline void gen_s4subl (void) |
492 | { | 464 | { |
493 | - gen_op_s4(); | 465 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 2); |
494 | gen_op_subl(); | 466 | gen_op_subl(); |
495 | } | 467 | } |
496 | 468 | ||
497 | static always_inline void gen_s8addl (void) | 469 | static always_inline void gen_s8addl (void) |
498 | { | 470 | { |
499 | - gen_op_s8(); | 471 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 3); |
500 | gen_op_addl(); | 472 | gen_op_addl(); |
501 | } | 473 | } |
502 | 474 | ||
503 | static always_inline void gen_s8subl (void) | 475 | static always_inline void gen_s8subl (void) |
504 | { | 476 | { |
505 | - gen_op_s8(); | 477 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 3); |
506 | gen_op_subl(); | 478 | gen_op_subl(); |
507 | } | 479 | } |
508 | 480 | ||
509 | static always_inline void gen_s4addq (void) | 481 | static always_inline void gen_s4addq (void) |
510 | { | 482 | { |
511 | - gen_op_s4(); | ||
512 | - gen_op_addq(); | 483 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 2); |
484 | + tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | ||
513 | } | 485 | } |
514 | 486 | ||
515 | static always_inline void gen_s4subq (void) | 487 | static always_inline void gen_s4subq (void) |
516 | { | 488 | { |
517 | - gen_op_s4(); | ||
518 | - gen_op_subq(); | 489 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 2); |
490 | + tcg_gen_sub_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | ||
519 | } | 491 | } |
520 | 492 | ||
521 | static always_inline void gen_s8addq (void) | 493 | static always_inline void gen_s8addq (void) |
522 | { | 494 | { |
523 | - gen_op_s8(); | ||
524 | - gen_op_addq(); | 495 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 3); |
496 | + tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | ||
525 | } | 497 | } |
526 | 498 | ||
527 | static always_inline void gen_s8subq (void) | 499 | static always_inline void gen_s8subq (void) |
528 | { | 500 | { |
529 | - gen_op_s8(); | ||
530 | - gen_op_subq(); | 501 | + tcg_gen_shli_i64(cpu_T[0], cpu_T[0], 3); |
502 | + tcg_gen_sub_i64(cpu_T[0], cpu_T[0], cpu_T[1]); | ||
531 | } | 503 | } |
532 | 504 | ||
533 | static always_inline void gen_amask (void) | 505 | static always_inline void gen_amask (void) |
@@ -1383,7 +1355,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1383,7 +1355,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
1383 | else | 1355 | else |
1384 | tcg_gen_movi_i64(cpu_T[0], 0); | 1356 | tcg_gen_movi_i64(cpu_T[0], 0); |
1385 | tcg_gen_movi_i64(cpu_T[1], disp12); | 1357 | tcg_gen_movi_i64(cpu_T[1], disp12); |
1386 | - gen_op_addq(); | 1358 | + tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]); |
1387 | switch ((insn >> 12) & 0xF) { | 1359 | switch ((insn >> 12) & 0xF) { |
1388 | case 0x0: | 1360 | case 0x0: |
1389 | /* Longword physical access */ | 1361 | /* Longword physical access */ |
@@ -1638,7 +1610,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1638,7 +1610,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
1638 | else | 1610 | else |
1639 | tcg_gen_movi_i64(cpu_T[0], 0); | 1611 | tcg_gen_movi_i64(cpu_T[0], 0); |
1640 | tcg_gen_movi_i64(cpu_T[1], (((int64_t)insn << 51) >> 51)); | 1612 | tcg_gen_movi_i64(cpu_T[1], (((int64_t)insn << 51) >> 51)); |
1641 | - gen_op_addq(); | 1613 | + tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]); |
1642 | gen_op_hw_ret(); | 1614 | gen_op_hw_ret(); |
1643 | } | 1615 | } |
1644 | ret = 2; | 1616 | ret = 2; |
@@ -1652,11 +1624,9 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | @@ -1652,11 +1624,9 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) | ||
1652 | if (!ctx->pal_mode) | 1624 | if (!ctx->pal_mode) |
1653 | goto invalid_opc; | 1625 | goto invalid_opc; |
1654 | if (ra != 31) | 1626 | if (ra != 31) |
1655 | - tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]); | 1627 | + tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp12); |
1656 | else | 1628 | else |
1657 | - tcg_gen_movi_i64(cpu_T[0], 0); | ||
1658 | - tcg_gen_movi_i64(cpu_T[1], disp12); | ||
1659 | - gen_op_addq(); | 1629 | + tcg_gen_movi_i64(cpu_T[0], disp12); |
1660 | if (ra != 31) | 1630 | if (ra != 31) |
1661 | tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]); | 1631 | tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]); |
1662 | else | 1632 | else |