Update of /cvsroot/hppaqemu/hppaqemu/target-hppa
In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv8042/target-hppa
Modified Files:
op.c translate.c
Log Message:
Implement compare conditions.
Index: translate.c
===================================================================
RCS file: /cvsroot/hppaqemu/hppaqemu/target-hppa/translate.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -C2 -d -r1.21 -r1.22
*** translate.c 12 Mar 2007 18:29:51 -0000 1.21
--- translate.c 12 Mar 2007 20:00:46 -0000 1.22
***************
*** 639,642 ****
--- 639,665 ----
}
+ static GenOpFunc * const gen_cond[2][8] = {
+ {
+ gen_op_eval_cmp_never,
+ gen_op_eval_cmp_eq,
+ gen_op_eval_cmp_slt,
+ gen_op_eval_cmp_slteq,
+ gen_op_eval_cmp_ult,
+ gen_op_eval_cmp_ulteq,
+ gen_op_eval_cmp_sv,
+ gen_op_eval_cmp_od,
+ },
+ {
+ gen_op_eval_cmp_tr,
+ gen_op_eval_cmp_neq,
+ gen_op_eval_cmp_sgteq,
+ gen_op_eval_cmp_sgt,
+ gen_op_eval_cmp_ugteq,
+ gen_op_eval_cmp_ugt,
+ gen_op_eval_cmp_nsv,
+ gen_op_eval_cmp_ev,
+ },
+ };
+
static void gen_branch_cond(DisasContext *dc, long tb, target_ulong disp, int n)
{
***************
*** 647,651 ****
l1 = gen_new_label();
! gen_op_jz_T2_label(l1);
/* taken branch */
--- 670,674 ----
l1 = gen_new_label();
! gen_op_jnz_T2_label(l1);
/* taken branch */
***************
*** 1568,1573 ****
r2 = field(insn, 21, 5);
r1 = field(insn, 16, 5);
! gen_op_movl_T0_reg(r1);
! gen_op_movl_T1_reg(r2);
break;
}
--- 1591,1596 ----
r2 = field(insn, 21, 5);
r1 = field(insn, 16, 5);
! gen_movl_T0_reg(r1);
! gen_movl_T1_reg(r2);
break;
}
***************
*** 1578,1583 ****
r = field(insn, 21, 5);
im5 = field_signext(insn, 16, 5);
! gen_op_movl_T0_im(im5);
! gen_op_movl_T1_reg(r);
break;
}
--- 1601,1606 ----
r = field(insn, 21, 5);
im5 = field_signext(insn, 16, 5);
! gen_movl_T0_im(im5);
! gen_movl_T1_reg(r);
break;
}
***************
*** 1589,1593 ****
disp = (((w1 << 1) | w) << 2);
! /* gen_cond(c); */
gen_branch_cond(dc, (long)dc->tb, disp, n);
--- 1612,1616 ----
disp = (((w1 << 1) | w) << 2);
! gen_cond[0][c]();
gen_branch_cond(dc, (long)dc->tb, disp, n);
Index: op.c
===================================================================
RCS file: /cvsroot/hppaqemu/hppaqemu/target-hppa/op.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** op.c 12 Mar 2007 18:01:01 -0000 1.17
--- op.c 12 Mar 2007 20:00:46 -0000 1.18
***************
*** 778,781 ****
--- 778,879 ----
}
+ /* Compare/subtract conditions:
+ * See table 5-3 in PA1.1 Specification
+ */
+
+ /* f = 0 */
+
+ void OPPROTO op_eval_cmp_never(void)
+ {
+ T2 = 0;
+ }
+
+ void OPPROTO op_eval_cmp_eq(void)
+ {
+ T2 = (T0 == T1);
+ }
+
+ void OPPROTO op_eval_cmp_slt(void)
+ {
+ T2 = ((int32_t)T0 < (int32_t)T1);
+ }
+
+ void OPPROTO op_eval_cmp_slteq(void)
+ {
+ T2 = ((int32_t)T0 <= (int32_t)T1);
+ }
+
+ void OPPROTO op_eval_cmp_ult(void)
+ {
+ T2 = (T0 < T1);
+ }
+
+ void OPPROTO op_eval_cmp_ulteq(void)
+ {
+ T2 = (T0 <= T1);
+ }
+
+ void OPPROTO op_eval_cmp_sv(void)
+ {
+ if ((((int32_t)T0 < 0) != ((int32_t)T1 < 0)) &&
+ (((int32_t)T1 < 0) == ((int32_t)(T0 - T1) < 0)))
+ T2 = 1;
+ else
+ T2 = 0;
+
+ FORCE_RET();
+ }
+
+ void OPPROTO op_eval_cmp_od(void)
+ {
+ T2 = ((T0 - T1) & 1);
+ }
+
+ /* f = 1 */
+
+ void OPPROTO op_eval_cmp_tr(void)
+ {
+ T2 = 1;
+ }
+
+ void OPPROTO op_eval_cmp_neq(void)
+ {
+ T2 = (T0 != T1);
+ }
+
+ void OPPROTO op_eval_cmp_sgteq(void)
+ {
+ T2 = ((int32_t)T0 >= (int32_t)T1);
+ }
+
+ void OPPROTO op_eval_cmp_sgt(void)
+ {
+ T2 = ((int32_t)T0 > (int32_t)T1);
+ }
+
+ void OPPROTO op_eval_cmp_ugteq(void)
+ {
+ T2 = (T0 > T1);
+ }
+
+ void OPPROTO op_eval_cmp_ugt(void)
+ {
+ T2 = (T0 >= T1);
+ }
+
+ void OPPROTO op_eval_cmp_nsv(void)
+ {
+ if ((((int32_t)T0 < 0) != ((int32_t)T1 < 0)) &&
+ (((int32_t)T1 < 0) == ((int32_t)(T0 - T1) < 0)))
+ T2 = 0;
+ else
+ T2 = 1;
+ }
+
+ void OPPROTO op_eval_cmp_ev(void)
+ {
+ T2 = !((T0 - T1) & 1);
+ }
+
void OPPROTO op_jmp_im(void)
{
***************
*** 784,790 ****
}
! void OPPROTO op_jz_T2_label(void)
{
! if (!T2)
GOTO_LABEL_PARAM(1);
FORCE_RET();
--- 882,888 ----
}
! void OPPROTO op_jnz_T2_label(void)
{
! if (T2)
GOTO_LABEL_PARAM(1);
FORCE_RET();
|