From: Stuart B. <zu...@us...> - 2007-03-13 01:06:05
|
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 ---- |