Update of /cvsroot/hppaqemu/hppaqemu/target-hppa
In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv31735/target-hppa
Modified Files:
op.c translate.c
Log Message:
Implement addition conditions.
Initial version of ADDBT, ADDIBT, ADDBF and ADDIBF.
Fix typo in comment (ADDIOT -> ADDITO).
Index: translate.c
===================================================================
RCS file: /cvsroot/hppaqemu/hppaqemu/target-hppa/translate.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -C2 -d -r1.23 -r1.24
*** translate.c 13 Mar 2007 00:57:45 -0000 1.23
--- translate.c 13 Mar 2007 01:06:01 -0000 1.24
***************
*** 639,642 ****
--- 639,653 ----
}
+ static GenOpFunc * const gen_cond_add[8] = {
+ gen_op_eval_never,
+ gen_op_eval_add_eq,
+ gen_op_eval_add_slt,
+ gen_op_eval_add_slteq,
+ gen_op_eval_add_nuv,
+ gen_op_eval_add_znv,
+ gen_op_eval_add_sv,
+ gen_op_eval_add_od,
+ };
+
static GenOpFunc * const gen_cond_cmp[8] = {
gen_op_eval_never,
***************
*** 1643,1653 ****
case 0x26: /* FPYSUB */
case 0x28: /* ADDBT */
case 0x29: /* ADDIBT */
case 0x2a: /* ADDBF */
case 0x2b: /* ADDIBF */
break;
! case 0x2c: /* ADDIT, ADDIOT */
case 0x2d: /* ADDI, ADDIO */
{
--- 1654,1703 ----
case 0x26: /* FPYSUB */
+ /* TODO */
+ break;
+
case 0x28: /* ADDBT */
case 0x29: /* ADDIBT */
case 0x2a: /* ADDBF */
case 0x2b: /* ADDIBF */
+ {
+ uint32_t c, w1, n, w, disp;
+ switch(op) {
+ case 0x28: /* ADDBT */
+ case 0x2a: /* ADDBF */
+ {
+ uint32_t r1, r2;
+ r2 = field(insn, 21, 5);
+ r1 = field(insn, 16, 5);
+ gen_movl_T0_reg(r1);
+ gen_movl_T1_reg(r2);
+ break;
+ }
+ case 0x29: /* ADDIBT */
+ case 0x2b: /* ADDIBF */
+ {
+ uint32_t r, im5;
+ r = field(insn, 21, 5);
+ im5 = field_signext(insn, 16, 5);
+ gen_movl_T0_im(im5);
+ gen_movl_T1_reg(r);
+ break;
+ }
+ }
+ c = field(insn, 13, 3);
+ w1 = field_signext(insn, 2, 11);
+ n = field(insn, 1, 1);
+ w = field(insn, 0, 1);
+ disp = (((w1 << 1) | w) << 2);
+
+ gen_cond_add[c]();
+ gen_branch_cond(dc, (long)dc->tb, disp, n, 0);
+
+ /* FIXME */
+ dc->is_br = 1;
break;
+ }
! case 0x2c: /* ADDIT, ADDITO */
case 0x2d: /* ADDI, ADDIO */
{
Index: op.c
===================================================================
RCS file: /cvsroot/hppaqemu/hppaqemu/target-hppa/op.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** op.c 13 Mar 2007 00:57:45 -0000 1.19
--- op.c 13 Mar 2007 01:06:01 -0000 1.20
***************
*** 785,788 ****
--- 785,840 ----
}
+ /* Addition conditions:
+ * See table 5-4 in PA1.1 Specification
+ */
+
+ /* = */
+ void OPPROTO op_eval_add_eq(void)
+ {
+ T2 = (T0 == -T1);
+ }
+
+ /* < */
+ void OPPROTO op_eval_add_slt(void)
+ {
+ T2 = ((int32_t)T0 < -(int32_t)T1);
+ }
+
+ /* <= */
+ void OPPROTO op_eval_add_slteq(void)
+ {
+ T2 = ((int32_t)T0 <= -(int32_t)T1);
+ }
+
+ /* nuv */
+ void OPPROTO op_eval_add_nuv(void)
+ {
+ T2 = (T0 + T1 >= T0);
+ }
+
+ /* znv */
+ void OPPROTO op_eval_add_znv(void)
+ {
+ T2 = ((T0 + T1 == 0) || (T0 + T1 >= T0));
+ }
+
+ /* sv */
+ void OPPROTO op_eval_add_sv(void)
+ {
+ if ((((int32_t)T0 < 0) == ((int32_t)T1 < 0)) &&
+ (((int32_t)T0 < 0) != ((int32_t)(T0 + T1) < 0)))
+ T2 = 0;
+ else
+ T2 = 1;
+
+ FORCE_RET();
+ }
+
+ /* od */
+ void OPPROTO op_eval_add_od(void)
+ {
+ T2 = ((T0 + T1) & 1);
+ }
+
/* Compare/subtract conditions:
* See table 5-3 in PA1.1 Specification
***************
*** 837,841 ****
}
-
/* ------ */
--- 889,892 ----
|