From: Stuart B. <zu...@us...> - 2007-03-21 23:07:48
|
Update of /cvsroot/hppaqemu/hppaqemu/target-hppa In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv32004 Modified Files: translate.c Log Message: Fix branch displacement calculation for COMI?B[TF] and ADDI?B[TF]. Index: translate.c =================================================================== RCS file: /cvsroot/hppaqemu/hppaqemu/target-hppa/translate.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- translate.c 21 Mar 2007 20:20:00 -0000 1.36 +++ translate.c 21 Mar 2007 23:07:45 -0000 1.37 @@ -96,6 +96,10 @@ return val; } +static uint32_t assemble_12(uint32_t x, uint32_t y) { + return (y << 11) | ((x & 1) << 10) | ((x >> 1) & ~(~0 << 9)); +} + static GenOpFunc *gen_op_movl_TN_reg[3][32] = { { @@ -1783,10 +1787,10 @@ } } c = field(insn, 13, 3); - w1 = field_signext(insn, 2, 11); + w1 = field(insn, 2, 11); n = field(insn, 1, 1); w = field(insn, 0, 1); - disp = (((w1 << 1) | w) << 2); + disp = signext(assemble_12(w1, w), 12) << 2; gen_cond_sub[c](); gen_branch_cond(dc, (long)dc->tb, disp, n, 0); @@ -1874,10 +1878,10 @@ } } c = field(insn, 13, 3); - w1 = field_signext(insn, 2, 11); + w1 = field(insn, 2, 11); n = field(insn, 1, 1); w = field(insn, 0, 1); - disp = (((w1 << 1) | w) << 2); + disp = signext(assemble_12(w1, w), 12) << 2; gen_cond_add[c](); gen_branch_cond(dc, (long)dc->tb, disp, n, 0); @@ -1919,6 +1923,7 @@ case 0x31: /* BB */ case 0x32: /* MOVB */ case 0x33: /* MOVIB */ + /* disp = signext(assemble_12(w1, w), 12) << 2; */ /* FIXME */ dc->is_br = 1; break; |