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 | 148 | #include "op_mem.h" |
| 149 | 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 | 151 | /* Misc */ |
| 159 | 152 | void OPPROTO op_excp (void) |
| 160 | 153 | { |
| ... | ... | @@ -259,18 +252,6 @@ void OPPROTO op_sublv (void) |
| 259 | 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 | 255 | void OPPROTO op_mull (void) |
| 275 | 256 | { |
| 276 | 257 | T0 = (int64_t)((int32_t)T0 * (int32_t)T1); |
| ... | ... | @@ -646,19 +627,6 @@ void OPPROTO op_cmplbc (void) |
| 646 | 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 | 630 | #if 0 // Qemu does not know how to do this... |
| 663 | 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 | 273 | gen_op_nop(); |
| 274 | 274 | } else { |
| 275 | 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 | 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 | 279 | if (clear) |
| 284 | - gen_op_n7(); | |
| 280 | + tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7); | |
| 285 | 281 | (*gen_load_op)(ctx); |
| 286 | 282 | if (ra != 31) |
| 287 | 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 | 290 | int clear) |
| 295 | 291 | { |
| 296 | 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 | 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 | 296 | if (clear) |
| 305 | - gen_op_n7(); | |
| 297 | + tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7); | |
| 306 | 298 | if (ra != 31) |
| 307 | 299 | tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]); |
| 308 | 300 | else |
| ... | ... | @@ -315,13 +307,9 @@ static always_inline void gen_load_fmem (DisasContext *ctx, |
| 315 | 307 | int ra, int rb, int32_t disp16) |
| 316 | 308 | { |
| 317 | 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 | 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 | 313 | (*gen_load_fop)(ctx); |
| 326 | 314 | gen_store_fir(ctx, ra, 1); |
| 327 | 315 | } |
| ... | ... | @@ -331,13 +319,9 @@ static always_inline void gen_store_fmem (DisasContext *ctx, |
| 331 | 319 | int ra, int rb, int32_t disp16) |
| 332 | 320 | { |
| 333 | 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 | 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 | 325 | gen_load_fir(ctx, ra, 1); |
| 342 | 326 | (*gen_store_fop)(ctx); |
| 343 | 327 | } |
| ... | ... | @@ -346,13 +330,7 @@ static always_inline void gen_bcond (DisasContext *ctx, |
| 346 | 330 | void (*gen_test_op)(void), |
| 347 | 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 | 334 | if (ra != 31) |
| 357 | 335 | tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]); |
| 358 | 336 | else |
| ... | ... | @@ -365,13 +343,7 @@ static always_inline void gen_fbcond (DisasContext *ctx, |
| 365 | 343 | void (*gen_test_op)(void), |
| 366 | 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 | 347 | gen_load_fir(ctx, ra, 0); |
| 376 | 348 | (*gen_test_op)(); |
| 377 | 349 | _gen_op_bcond(ctx); |
| ... | ... | @@ -484,50 +456,50 @@ static always_inline void gen_itf (DisasContext *ctx, |
| 484 | 456 | |
| 485 | 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 | 460 | gen_op_addl(); |
| 489 | 461 | } |
| 490 | 462 | |
| 491 | 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 | 466 | gen_op_subl(); |
| 495 | 467 | } |
| 496 | 468 | |
| 497 | 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 | 472 | gen_op_addl(); |
| 501 | 473 | } |
| 502 | 474 | |
| 503 | 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 | 478 | gen_op_subl(); |
| 507 | 479 | } |
| 508 | 480 | |
| 509 | 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 | 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 | 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 | 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 | 505 | static always_inline void gen_amask (void) |
| ... | ... | @@ -1383,7 +1355,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 1383 | 1355 | else |
| 1384 | 1356 | tcg_gen_movi_i64(cpu_T[0], 0); |
| 1385 | 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 | 1359 | switch ((insn >> 12) & 0xF) { |
| 1388 | 1360 | case 0x0: |
| 1389 | 1361 | /* Longword physical access */ |
| ... | ... | @@ -1638,7 +1610,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 1638 | 1610 | else |
| 1639 | 1611 | tcg_gen_movi_i64(cpu_T[0], 0); |
| 1640 | 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 | 1614 | gen_op_hw_ret(); |
| 1643 | 1615 | } |
| 1644 | 1616 | ret = 2; |
| ... | ... | @@ -1652,11 +1624,9 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
| 1652 | 1624 | if (!ctx->pal_mode) |
| 1653 | 1625 | goto invalid_opc; |
| 1654 | 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 | 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 | 1630 | if (ra != 31) |
| 1661 | 1631 | tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]); |
| 1662 | 1632 | else | ... | ... |