From: Stuart B. <zu...@us...> - 2007-03-12 20:00:50
|
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(); |