Commit f3f478a7efe9dc76325d0c774ca2e728d465bbe0
1 parent
ef28fd86
Fix signed/unsigned issues of immediate version of brcond (malc)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4588 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
48 additions
and
11 deletions
tcg/ppc/tcg-target.c
| ... | ... | @@ -866,18 +866,55 @@ static void tcg_out_brcond(TCGContext *s, int cond, |
| 866 | 866 | int imm; |
| 867 | 867 | uint32_t op; |
| 868 | 868 | |
| 869 | - imm = const_arg2 ? ((int16_t) arg2 == arg2) : 0; | |
| 870 | 869 | switch (cond) { |
| 871 | - case TCG_COND_EQ: op = imm ? CMPLI : CMPL; break; | |
| 872 | - case TCG_COND_NE: op = imm ? CMPLI : CMPL; break; | |
| 873 | - case TCG_COND_LT: op = imm ? CMPI : CMP; break; | |
| 874 | - case TCG_COND_GE: op = imm ? CMPI : CMP; break; | |
| 875 | - case TCG_COND_LE: op = imm ? CMPI : CMP; break; | |
| 876 | - case TCG_COND_GT: op = imm ? CMPI : CMP; break; | |
| 877 | - case TCG_COND_LTU: op = imm ? CMPLI : CMPL; break; | |
| 878 | - case TCG_COND_GEU: op = imm ? CMPLI : CMPL; break; | |
| 879 | - case TCG_COND_LEU: op = imm ? CMPLI : CMPL; break; | |
| 880 | - case TCG_COND_GTU: op = imm ? CMPLI : CMPL; break; | |
| 870 | + case TCG_COND_EQ: | |
| 871 | + case TCG_COND_NE: | |
| 872 | + if (const_arg2) { | |
| 873 | + if ((int16_t) arg2 == arg2) { | |
| 874 | + op = CMPI; | |
| 875 | + imm = 1; | |
| 876 | + break; | |
| 877 | + } | |
| 878 | + else if ((uint16_t) arg2 == arg2) { | |
| 879 | + op = CMPLI; | |
| 880 | + imm = 1; | |
| 881 | + break; | |
| 882 | + } | |
| 883 | + } | |
| 884 | + op = CMPL; | |
| 885 | + imm = 0; | |
| 886 | + break; | |
| 887 | + | |
| 888 | + case TCG_COND_LT: | |
| 889 | + case TCG_COND_GE: | |
| 890 | + case TCG_COND_LE: | |
| 891 | + case TCG_COND_GT: | |
| 892 | + if (const_arg2) { | |
| 893 | + if ((int16_t) arg2 == arg2) { | |
| 894 | + op = CMPI; | |
| 895 | + imm = 1; | |
| 896 | + break; | |
| 897 | + } | |
| 898 | + } | |
| 899 | + op = CMP; | |
| 900 | + imm = 0; | |
| 901 | + break; | |
| 902 | + | |
| 903 | + case TCG_COND_LTU: | |
| 904 | + case TCG_COND_GEU: | |
| 905 | + case TCG_COND_LEU: | |
| 906 | + case TCG_COND_GTU: | |
| 907 | + if (const_arg2) { | |
| 908 | + if ((uint16_t) arg2 == arg2) { | |
| 909 | + op = CMPLI; | |
| 910 | + imm = 1; | |
| 911 | + break; | |
| 912 | + } | |
| 913 | + } | |
| 914 | + op = CMPL; | |
| 915 | + imm = 0; | |
| 916 | + break; | |
| 917 | + | |
| 881 | 918 | default: |
| 882 | 919 | tcg_abort (); |
| 883 | 920 | } | ... | ... |