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 | } | ... | ... |