Commit 6231868b110365d0d870c2f4974bfba26ccb86a9
1 parent
c1e1a491
CRIS: Purify some of the flag evaluation helpers.
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6227 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
154 additions
and
160 deletions
target-cris/helper.h
| @@ -13,13 +13,13 @@ DEF_HELPER_2(movl_reg_sreg, void, i32, i32) | @@ -13,13 +13,13 @@ DEF_HELPER_2(movl_reg_sreg, void, i32, i32) | ||
| 13 | DEF_HELPER_FLAGS_1(lz, TCG_CALL_PURE, i32, i32); | 13 | DEF_HELPER_FLAGS_1(lz, TCG_CALL_PURE, i32, i32); |
| 14 | DEF_HELPER_FLAGS_3(btst, TCG_CALL_PURE, i32, i32, i32, i32); | 14 | DEF_HELPER_FLAGS_3(btst, TCG_CALL_PURE, i32, i32, i32, i32); |
| 15 | 15 | ||
| 16 | -DEF_HELPER_0(evaluate_flags_muls, void) | ||
| 17 | -DEF_HELPER_0(evaluate_flags_mulu, void) | ||
| 18 | -DEF_HELPER_0(evaluate_flags_mcp, void) | ||
| 19 | -DEF_HELPER_0(evaluate_flags_alu_4, void) | ||
| 20 | -DEF_HELPER_0(evaluate_flags_sub_4, void) | ||
| 21 | -DEF_HELPER_0(evaluate_flags_move_4, void) | ||
| 22 | -DEF_HELPER_0(evaluate_flags_move_2, void) | 16 | +DEF_HELPER_FLAGS_3(evaluate_flags_muls, TCG_CALL_PURE, i32, i32, i32, i32) |
| 17 | +DEF_HELPER_FLAGS_3(evaluate_flags_mulu, TCG_CALL_PURE, i32, i32, i32, i32) | ||
| 18 | +DEF_HELPER_FLAGS_4(evaluate_flags_mcp, TCG_CALL_PURE, i32, i32, i32, i32, i32) | ||
| 19 | +DEF_HELPER_FLAGS_4(evaluate_flags_alu_4, TCG_CALL_PURE, i32, i32, i32, i32, i32) | ||
| 20 | +DEF_HELPER_FLAGS_4(evaluate_flags_sub_4, TCG_CALL_PURE, i32, i32, i32, i32, i32) | ||
| 21 | +DEF_HELPER_FLAGS_2(evaluate_flags_move_4, TCG_CALL_PURE, i32, i32, i32) | ||
| 22 | +DEF_HELPER_FLAGS_2(evaluate_flags_move_2, TCG_CALL_PURE, i32, i32, i32) | ||
| 23 | DEF_HELPER_0(evaluate_flags, void) | 23 | DEF_HELPER_0(evaluate_flags, void) |
| 24 | DEF_HELPER_0(top_evaluate_flags, void) | 24 | DEF_HELPER_0(top_evaluate_flags, void) |
| 25 | 25 |
target-cris/op_helper.c
| @@ -275,7 +275,7 @@ uint32_t helper_btst(uint32_t t0, uint32_t t1, uint32_t ccs) | @@ -275,7 +275,7 @@ uint32_t helper_btst(uint32_t t0, uint32_t t1, uint32_t ccs) | ||
| 275 | return ccs; | 275 | return ccs; |
| 276 | } | 276 | } |
| 277 | 277 | ||
| 278 | -static void evaluate_flags_writeback(uint32_t flags) | 278 | +static inline uint32_t evaluate_flags_writeback(uint32_t flags, uint32_t ccs) |
| 279 | { | 279 | { |
| 280 | unsigned int x, z, mask; | 280 | unsigned int x, z, mask; |
| 281 | 281 | ||
| @@ -289,27 +289,19 @@ static void evaluate_flags_writeback(uint32_t flags) | @@ -289,27 +289,19 @@ static void evaluate_flags_writeback(uint32_t flags) | ||
| 289 | flags &= mask; | 289 | flags &= mask; |
| 290 | 290 | ||
| 291 | /* all insn clear the x-flag except setf or clrf. */ | 291 | /* all insn clear the x-flag except setf or clrf. */ |
| 292 | - env->pregs[PR_CCS] &= ~mask; | ||
| 293 | - env->pregs[PR_CCS] |= flags; | 292 | + ccs &= ~mask; |
| 293 | + ccs |= flags; | ||
| 294 | + return ccs; | ||
| 294 | } | 295 | } |
| 295 | 296 | ||
| 296 | -void helper_evaluate_flags_muls(void) | 297 | +uint32_t helper_evaluate_flags_muls(uint32_t ccs, uint32_t res, uint32_t mof) |
| 297 | { | 298 | { |
| 298 | - uint32_t src; | ||
| 299 | - uint32_t dst; | ||
| 300 | - uint32_t res; | ||
| 301 | uint32_t flags = 0; | 299 | uint32_t flags = 0; |
| 302 | int64_t tmp; | 300 | int64_t tmp; |
| 303 | - int32_t mof; | ||
| 304 | int dneg; | 301 | int dneg; |
| 305 | 302 | ||
| 306 | - src = env->cc_src; | ||
| 307 | - dst = env->cc_dest; | ||
| 308 | - res = env->cc_result; | ||
| 309 | - | ||
| 310 | dneg = ((int32_t)res) < 0; | 303 | dneg = ((int32_t)res) < 0; |
| 311 | 304 | ||
| 312 | - mof = env->pregs[PR_MOF]; | ||
| 313 | tmp = mof; | 305 | tmp = mof; |
| 314 | tmp <<= 32; | 306 | tmp <<= 32; |
| 315 | tmp |= res; | 307 | tmp |= res; |
| @@ -320,23 +312,14 @@ void helper_evaluate_flags_muls(void) | @@ -320,23 +312,14 @@ void helper_evaluate_flags_muls(void) | ||
| 320 | if ((dneg && mof != -1) | 312 | if ((dneg && mof != -1) |
| 321 | || (!dneg && mof != 0)) | 313 | || (!dneg && mof != 0)) |
| 322 | flags |= V_FLAG; | 314 | flags |= V_FLAG; |
| 323 | - evaluate_flags_writeback(flags); | 315 | + return evaluate_flags_writeback(flags, ccs); |
| 324 | } | 316 | } |
| 325 | 317 | ||
| 326 | -void helper_evaluate_flags_mulu(void) | 318 | +uint32_t helper_evaluate_flags_mulu(uint32_t ccs, uint32_t res, uint32_t mof) |
| 327 | { | 319 | { |
| 328 | - uint32_t src; | ||
| 329 | - uint32_t dst; | ||
| 330 | - uint32_t res; | ||
| 331 | uint32_t flags = 0; | 320 | uint32_t flags = 0; |
| 332 | uint64_t tmp; | 321 | uint64_t tmp; |
| 333 | - uint32_t mof; | ||
| 334 | 322 | ||
| 335 | - src = env->cc_src; | ||
| 336 | - dst = env->cc_dest; | ||
| 337 | - res = env->cc_result; | ||
| 338 | - | ||
| 339 | - mof = env->pregs[PR_MOF]; | ||
| 340 | tmp = mof; | 323 | tmp = mof; |
| 341 | tmp <<= 32; | 324 | tmp <<= 32; |
| 342 | tmp |= res; | 325 | tmp |= res; |
| @@ -347,19 +330,16 @@ void helper_evaluate_flags_mulu(void) | @@ -347,19 +330,16 @@ void helper_evaluate_flags_mulu(void) | ||
| 347 | if (mof) | 330 | if (mof) |
| 348 | flags |= V_FLAG; | 331 | flags |= V_FLAG; |
| 349 | 332 | ||
| 350 | - evaluate_flags_writeback(flags); | 333 | + return evaluate_flags_writeback(flags, ccs); |
| 351 | } | 334 | } |
| 352 | 335 | ||
| 353 | -void helper_evaluate_flags_mcp(void) | 336 | +uint32_t helper_evaluate_flags_mcp(uint32_t ccs, |
| 337 | + uint32_t src, uint32_t dst, uint32_t res) | ||
| 354 | { | 338 | { |
| 355 | - uint32_t src; | ||
| 356 | - uint32_t dst; | ||
| 357 | - uint32_t res; | ||
| 358 | uint32_t flags = 0; | 339 | uint32_t flags = 0; |
| 359 | 340 | ||
| 360 | - src = env->cc_src & 0x80000000; | ||
| 361 | - dst = env->cc_dest & 0x80000000; | ||
| 362 | - res = env->cc_result; | 341 | + src = src & 0x80000000; |
| 342 | + dst = dst & 0x80000000; | ||
| 363 | 343 | ||
| 364 | if ((res & 0x80000000L) != 0L) | 344 | if ((res & 0x80000000L) != 0L) |
| 365 | { | 345 | { |
| @@ -379,19 +359,16 @@ void helper_evaluate_flags_mcp(void) | @@ -379,19 +359,16 @@ void helper_evaluate_flags_mcp(void) | ||
| 379 | flags |= R_FLAG; | 359 | flags |= R_FLAG; |
| 380 | } | 360 | } |
| 381 | 361 | ||
| 382 | - evaluate_flags_writeback(flags); | 362 | + return evaluate_flags_writeback(flags, ccs); |
| 383 | } | 363 | } |
| 384 | 364 | ||
| 385 | -void helper_evaluate_flags_alu_4(void) | 365 | +uint32_t helper_evaluate_flags_alu_4(uint32_t ccs, |
| 366 | + uint32_t src, uint32_t dst, uint32_t res) | ||
| 386 | { | 367 | { |
| 387 | - uint32_t src; | ||
| 388 | - uint32_t dst; | ||
| 389 | - uint32_t res; | ||
| 390 | uint32_t flags = 0; | 368 | uint32_t flags = 0; |
| 391 | 369 | ||
| 392 | - src = env->cc_src & 0x80000000; | ||
| 393 | - dst = env->cc_dest & 0x80000000; | ||
| 394 | - res = env->cc_result; | 370 | + src = src & 0x80000000; |
| 371 | + dst = dst & 0x80000000; | ||
| 395 | 372 | ||
| 396 | if ((res & 0x80000000L) != 0L) | 373 | if ((res & 0x80000000L) != 0L) |
| 397 | { | 374 | { |
| @@ -411,19 +388,16 @@ void helper_evaluate_flags_alu_4(void) | @@ -411,19 +388,16 @@ void helper_evaluate_flags_alu_4(void) | ||
| 411 | flags |= C_FLAG; | 388 | flags |= C_FLAG; |
| 412 | } | 389 | } |
| 413 | 390 | ||
| 414 | - evaluate_flags_writeback(flags); | 391 | + return evaluate_flags_writeback(flags, ccs); |
| 415 | } | 392 | } |
| 416 | 393 | ||
| 417 | -void helper_evaluate_flags_sub_4(void) | 394 | +uint32_t helper_evaluate_flags_sub_4(uint32_t ccs, |
| 395 | + uint32_t src, uint32_t dst, uint32_t res) | ||
| 418 | { | 396 | { |
| 419 | - uint32_t src; | ||
| 420 | - uint32_t dst; | ||
| 421 | - uint32_t res; | ||
| 422 | uint32_t flags = 0; | 397 | uint32_t flags = 0; |
| 423 | 398 | ||
| 424 | - src = (~env->cc_src) & 0x80000000; | ||
| 425 | - dst = env->cc_dest & 0x80000000; | ||
| 426 | - res = env->cc_result; | 399 | + src = (~src) & 0x80000000; |
| 400 | + dst = dst & 0x80000000; | ||
| 427 | 401 | ||
| 428 | if ((res & 0x80000000L) != 0L) | 402 | if ((res & 0x80000000L) != 0L) |
| 429 | { | 403 | { |
| @@ -444,47 +418,37 @@ void helper_evaluate_flags_sub_4(void) | @@ -444,47 +418,37 @@ void helper_evaluate_flags_sub_4(void) | ||
| 444 | } | 418 | } |
| 445 | 419 | ||
| 446 | flags ^= C_FLAG; | 420 | flags ^= C_FLAG; |
| 447 | - evaluate_flags_writeback(flags); | 421 | + return evaluate_flags_writeback(flags, ccs); |
| 448 | } | 422 | } |
| 449 | 423 | ||
| 450 | -void helper_evaluate_flags_move_4 (void) | 424 | +uint32_t helper_evaluate_flags_move_4(uint32_t ccs, uint32_t res) |
| 451 | { | 425 | { |
| 452 | - uint32_t res; | ||
| 453 | uint32_t flags = 0; | 426 | uint32_t flags = 0; |
| 454 | 427 | ||
| 455 | - res = env->cc_result; | ||
| 456 | - | ||
| 457 | if ((int32_t)res < 0) | 428 | if ((int32_t)res < 0) |
| 458 | flags |= N_FLAG; | 429 | flags |= N_FLAG; |
| 459 | else if (res == 0L) | 430 | else if (res == 0L) |
| 460 | flags |= Z_FLAG; | 431 | flags |= Z_FLAG; |
| 461 | 432 | ||
| 462 | - evaluate_flags_writeback(flags); | 433 | + return evaluate_flags_writeback(flags, ccs); |
| 463 | } | 434 | } |
| 464 | -void helper_evaluate_flags_move_2 (void) | 435 | +uint32_t helper_evaluate_flags_move_2(uint32_t ccs, uint32_t res) |
| 465 | { | 436 | { |
| 466 | - uint32_t src; | ||
| 467 | uint32_t flags = 0; | 437 | uint32_t flags = 0; |
| 468 | - uint16_t res; | ||
| 469 | - | ||
| 470 | - src = env->cc_src; | ||
| 471 | - res = env->cc_result; | ||
| 472 | 438 | ||
| 473 | if ((int16_t)res < 0L) | 439 | if ((int16_t)res < 0L) |
| 474 | flags |= N_FLAG; | 440 | flags |= N_FLAG; |
| 475 | else if (res == 0) | 441 | else if (res == 0) |
| 476 | flags |= Z_FLAG; | 442 | flags |= Z_FLAG; |
| 477 | 443 | ||
| 478 | - evaluate_flags_writeback(flags); | 444 | + return evaluate_flags_writeback(flags, ccs); |
| 479 | } | 445 | } |
| 480 | 446 | ||
| 481 | /* TODO: This is expensive. We could split things up and only evaluate part of | 447 | /* TODO: This is expensive. We could split things up and only evaluate part of |
| 482 | CCR on a need to know basis. For now, we simply re-evaluate everything. */ | 448 | CCR on a need to know basis. For now, we simply re-evaluate everything. */ |
| 483 | -void helper_evaluate_flags (void) | 449 | +void helper_evaluate_flags(void) |
| 484 | { | 450 | { |
| 485 | - uint32_t src; | ||
| 486 | - uint32_t dst; | ||
| 487 | - uint32_t res; | 451 | + uint32_t src, dst, res; |
| 488 | uint32_t flags = 0; | 452 | uint32_t flags = 0; |
| 489 | 453 | ||
| 490 | src = env->cc_src; | 454 | src = env->cc_src; |
| @@ -595,11 +559,10 @@ void helper_evaluate_flags (void) | @@ -595,11 +559,10 @@ void helper_evaluate_flags (void) | ||
| 595 | break; | 559 | break; |
| 596 | } | 560 | } |
| 597 | 561 | ||
| 598 | - if (env->cc_op == CC_OP_SUB | ||
| 599 | - || env->cc_op == CC_OP_CMP) { | 562 | + if (env->cc_op == CC_OP_SUB || env->cc_op == CC_OP_CMP) |
| 600 | flags ^= C_FLAG; | 563 | flags ^= C_FLAG; |
| 601 | - } | ||
| 602 | - evaluate_flags_writeback(flags); | 564 | + |
| 565 | + env->pregs[PR_CCS] = evaluate_flags_writeback(flags, env->pregs[PR_CCS]); | ||
| 603 | } | 566 | } |
| 604 | 567 | ||
| 605 | void helper_top_evaluate_flags(void) | 568 | void helper_top_evaluate_flags(void) |
| @@ -607,13 +570,19 @@ void helper_top_evaluate_flags(void) | @@ -607,13 +570,19 @@ void helper_top_evaluate_flags(void) | ||
| 607 | switch (env->cc_op) | 570 | switch (env->cc_op) |
| 608 | { | 571 | { |
| 609 | case CC_OP_MCP: | 572 | case CC_OP_MCP: |
| 610 | - helper_evaluate_flags_mcp(); | 573 | + env->pregs[PR_CCS] = helper_evaluate_flags_mcp( |
| 574 | + env->pregs[PR_CCS], env->cc_src, | ||
| 575 | + env->cc_dest, env->cc_result); | ||
| 611 | break; | 576 | break; |
| 612 | case CC_OP_MULS: | 577 | case CC_OP_MULS: |
| 613 | - helper_evaluate_flags_muls(); | 578 | + env->pregs[PR_CCS] = helper_evaluate_flags_muls( |
| 579 | + env->pregs[PR_CCS], env->cc_result, | ||
| 580 | + env->pregs[PR_MOF]); | ||
| 614 | break; | 581 | break; |
| 615 | case CC_OP_MULU: | 582 | case CC_OP_MULU: |
| 616 | - helper_evaluate_flags_mulu(); | 583 | + env->pregs[PR_CCS] = helper_evaluate_flags_mulu( |
| 584 | + env->pregs[PR_CCS], env->cc_result, | ||
| 585 | + env->pregs[PR_MOF]); | ||
| 617 | break; | 586 | break; |
| 618 | case CC_OP_MOVE: | 587 | case CC_OP_MOVE: |
| 619 | case CC_OP_AND: | 588 | case CC_OP_AND: |
| @@ -622,26 +591,36 @@ void helper_top_evaluate_flags(void) | @@ -622,26 +591,36 @@ void helper_top_evaluate_flags(void) | ||
| 622 | case CC_OP_ASR: | 591 | case CC_OP_ASR: |
| 623 | case CC_OP_LSR: | 592 | case CC_OP_LSR: |
| 624 | case CC_OP_LSL: | 593 | case CC_OP_LSL: |
| 625 | - switch (env->cc_size) | ||
| 626 | - { | ||
| 627 | - case 4: | ||
| 628 | - helper_evaluate_flags_move_4(); | ||
| 629 | - break; | ||
| 630 | - case 2: | ||
| 631 | - helper_evaluate_flags_move_2(); | ||
| 632 | - break; | ||
| 633 | - default: | ||
| 634 | - helper_evaluate_flags(); | ||
| 635 | - break; | ||
| 636 | - } | ||
| 637 | - break; | 594 | + switch (env->cc_size) |
| 595 | + { | ||
| 596 | + case 4: | ||
| 597 | + env->pregs[PR_CCS] = | ||
| 598 | + helper_evaluate_flags_move_4( | ||
| 599 | + env->pregs[PR_CCS], | ||
| 600 | + env->cc_result); | ||
| 601 | + break; | ||
| 602 | + case 2: | ||
| 603 | + env->pregs[PR_CCS] = | ||
| 604 | + helper_evaluate_flags_move_2( | ||
| 605 | + env->pregs[PR_CCS], | ||
| 606 | + env->cc_result); | ||
| 607 | + break; | ||
| 608 | + default: | ||
| 609 | + helper_evaluate_flags(); | ||
| 610 | + break; | ||
| 611 | + } | ||
| 612 | + break; | ||
| 638 | case CC_OP_FLAGS: | 613 | case CC_OP_FLAGS: |
| 639 | /* live. */ | 614 | /* live. */ |
| 640 | break; | 615 | break; |
| 641 | case CC_OP_SUB: | 616 | case CC_OP_SUB: |
| 642 | case CC_OP_CMP: | 617 | case CC_OP_CMP: |
| 643 | if (env->cc_size == 4) | 618 | if (env->cc_size == 4) |
| 644 | - helper_evaluate_flags_sub_4(); | 619 | + env->pregs[PR_CCS] = |
| 620 | + helper_evaluate_flags_sub_4( | ||
| 621 | + env->pregs[PR_CCS], | ||
| 622 | + env->cc_src, env->cc_dest, | ||
| 623 | + env->cc_result); | ||
| 645 | else | 624 | else |
| 646 | helper_evaluate_flags(); | 625 | helper_evaluate_flags(); |
| 647 | break; | 626 | break; |
| @@ -649,12 +628,16 @@ void helper_top_evaluate_flags(void) | @@ -649,12 +628,16 @@ void helper_top_evaluate_flags(void) | ||
| 649 | { | 628 | { |
| 650 | switch (env->cc_size) | 629 | switch (env->cc_size) |
| 651 | { | 630 | { |
| 652 | - case 4: | ||
| 653 | - helper_evaluate_flags_alu_4(); | ||
| 654 | - break; | ||
| 655 | - default: | ||
| 656 | - helper_evaluate_flags(); | ||
| 657 | - break; | 631 | + case 4: |
| 632 | + env->pregs[PR_CCS] = | ||
| 633 | + helper_evaluate_flags_alu_4( | ||
| 634 | + env->pregs[PR_CCS], | ||
| 635 | + env->cc_src, env->cc_dest, | ||
| 636 | + env->cc_result); | ||
| 637 | + break; | ||
| 638 | + default: | ||
| 639 | + helper_evaluate_flags(); | ||
| 640 | + break; | ||
| 658 | } | 641 | } |
| 659 | } | 642 | } |
| 660 | break; | 643 | break; |
target-cris/translate.c
| @@ -565,74 +565,85 @@ static void cris_flush_cc_state(DisasContext *dc) | @@ -565,74 +565,85 @@ static void cris_flush_cc_state(DisasContext *dc) | ||
| 565 | 565 | ||
| 566 | static void cris_evaluate_flags(DisasContext *dc) | 566 | static void cris_evaluate_flags(DisasContext *dc) |
| 567 | { | 567 | { |
| 568 | - if (!dc->flags_uptodate) { | ||
| 569 | - cris_flush_cc_state(dc); | 568 | + if (dc->flags_uptodate) |
| 569 | + return; | ||
| 570 | 570 | ||
| 571 | - switch (dc->cc_op) | 571 | + cris_flush_cc_state(dc); |
| 572 | + | ||
| 573 | + switch (dc->cc_op) | ||
| 574 | + { | ||
| 575 | + case CC_OP_MCP: | ||
| 576 | + gen_helper_evaluate_flags_mcp(cpu_PR[PR_CCS], | ||
| 577 | + cpu_PR[PR_CCS], cc_src, | ||
| 578 | + cc_dest, cc_result); | ||
| 579 | + break; | ||
| 580 | + case CC_OP_MULS: | ||
| 581 | + gen_helper_evaluate_flags_muls(cpu_PR[PR_CCS], | ||
| 582 | + cpu_PR[PR_CCS], cc_result, | ||
| 583 | + cpu_PR[PR_MOF]); | ||
| 584 | + break; | ||
| 585 | + case CC_OP_MULU: | ||
| 586 | + gen_helper_evaluate_flags_mulu(cpu_PR[PR_CCS], | ||
| 587 | + cpu_PR[PR_CCS], cc_result, | ||
| 588 | + cpu_PR[PR_MOF]); | ||
| 589 | + break; | ||
| 590 | + case CC_OP_MOVE: | ||
| 591 | + case CC_OP_AND: | ||
| 592 | + case CC_OP_OR: | ||
| 593 | + case CC_OP_XOR: | ||
| 594 | + case CC_OP_ASR: | ||
| 595 | + case CC_OP_LSR: | ||
| 596 | + case CC_OP_LSL: | ||
| 597 | + switch (dc->cc_size) | ||
| 572 | { | 598 | { |
| 573 | - case CC_OP_MCP: | ||
| 574 | - gen_helper_evaluate_flags_mcp(); | ||
| 575 | - break; | ||
| 576 | - case CC_OP_MULS: | ||
| 577 | - gen_helper_evaluate_flags_muls(); | ||
| 578 | - break; | ||
| 579 | - case CC_OP_MULU: | ||
| 580 | - gen_helper_evaluate_flags_mulu(); | ||
| 581 | - break; | ||
| 582 | - case CC_OP_MOVE: | ||
| 583 | - case CC_OP_AND: | ||
| 584 | - case CC_OP_OR: | ||
| 585 | - case CC_OP_XOR: | ||
| 586 | - case CC_OP_ASR: | ||
| 587 | - case CC_OP_LSR: | ||
| 588 | - case CC_OP_LSL: | ||
| 589 | - switch (dc->cc_size) | ||
| 590 | - { | ||
| 591 | - case 4: | ||
| 592 | - gen_helper_evaluate_flags_move_4(); | ||
| 593 | - break; | ||
| 594 | - case 2: | ||
| 595 | - gen_helper_evaluate_flags_move_2(); | ||
| 596 | - break; | ||
| 597 | - default: | ||
| 598 | - gen_helper_evaluate_flags(); | ||
| 599 | - break; | ||
| 600 | - } | ||
| 601 | - break; | ||
| 602 | - case CC_OP_FLAGS: | ||
| 603 | - /* live. */ | ||
| 604 | - break; | ||
| 605 | - case CC_OP_SUB: | ||
| 606 | - case CC_OP_CMP: | ||
| 607 | - if (dc->cc_size == 4) | ||
| 608 | - gen_helper_evaluate_flags_sub_4(); | ||
| 609 | - else | ||
| 610 | - gen_helper_evaluate_flags(); | 599 | + case 4: |
| 600 | + gen_helper_evaluate_flags_move_4(cpu_PR[PR_CCS], | ||
| 601 | + cpu_PR[PR_CCS], cc_result); | ||
| 602 | + break; | ||
| 603 | + case 2: | ||
| 604 | + gen_helper_evaluate_flags_move_2(cpu_PR[PR_CCS], | ||
| 605 | + cpu_PR[PR_CCS], cc_result); | ||
| 606 | + break; | ||
| 607 | + default: | ||
| 608 | + gen_helper_evaluate_flags(); | ||
| 609 | + break; | ||
| 610 | + } | ||
| 611 | + break; | ||
| 612 | + case CC_OP_FLAGS: | ||
| 613 | + /* live. */ | ||
| 614 | + break; | ||
| 615 | + case CC_OP_SUB: | ||
| 616 | + case CC_OP_CMP: | ||
| 617 | + if (dc->cc_size == 4) | ||
| 618 | + gen_helper_evaluate_flags_sub_4(cpu_PR[PR_CCS], | ||
| 619 | + cpu_PR[PR_CCS], cc_src, cc_dest, cc_result); | ||
| 620 | + else | ||
| 621 | + gen_helper_evaluate_flags(); | ||
| 611 | 622 | ||
| 623 | + break; | ||
| 624 | + default: | ||
| 625 | + switch (dc->cc_size) | ||
| 626 | + { | ||
| 627 | + case 4: | ||
| 628 | + gen_helper_evaluate_flags_alu_4(cpu_PR[PR_CCS], | ||
| 629 | + cpu_PR[PR_CCS], cc_src, cc_dest, cc_result); | ||
| 612 | break; | 630 | break; |
| 613 | default: | 631 | default: |
| 614 | - switch (dc->cc_size) | ||
| 615 | - { | ||
| 616 | - case 4: | ||
| 617 | - gen_helper_evaluate_flags_alu_4(); | ||
| 618 | - break; | ||
| 619 | - default: | ||
| 620 | - gen_helper_evaluate_flags(); | ||
| 621 | - break; | ||
| 622 | - } | ||
| 623 | - break; | 632 | + gen_helper_evaluate_flags(); |
| 633 | + break; | ||
| 624 | } | 634 | } |
| 625 | - if (dc->flagx_known) { | ||
| 626 | - if (dc->flags_x) | ||
| 627 | - tcg_gen_ori_tl(cpu_PR[PR_CCS], | ||
| 628 | - cpu_PR[PR_CCS], X_FLAG); | ||
| 629 | - else | ||
| 630 | - tcg_gen_andi_tl(cpu_PR[PR_CCS], | ||
| 631 | - cpu_PR[PR_CCS], ~X_FLAG); | ||
| 632 | - } | ||
| 633 | - | ||
| 634 | - dc->flags_uptodate = 1; | 635 | + break; |
| 635 | } | 636 | } |
| 637 | + | ||
| 638 | + if (dc->flagx_known) { | ||
| 639 | + if (dc->flags_x) | ||
| 640 | + tcg_gen_ori_tl(cpu_PR[PR_CCS], | ||
| 641 | + cpu_PR[PR_CCS], X_FLAG); | ||
| 642 | + else | ||
| 643 | + tcg_gen_andi_tl(cpu_PR[PR_CCS], | ||
| 644 | + cpu_PR[PR_CCS], ~X_FLAG); | ||
| 645 | + } | ||
| 646 | + dc->flags_uptodate = 1; | ||
| 636 | } | 647 | } |
| 637 | 648 | ||
| 638 | static void cris_cc_mask(DisasContext *dc, unsigned int mask) | 649 | static void cris_cc_mask(DisasContext *dc, unsigned int mask) |