> > 0xffffffff is -1, 0x80000000 is -MAX.
> > -1/-MAX ?will raise a exception, and I've handle this.
> > -MAX/-1 ?will get a MAX, for max value of a register is -(-MAX)-1, so,
> > it overflowed, I didn't handle this.
>
> Actually you did this with three brcondi in the else branch. The only thing
> left is not to crash in case guest doesn't want range exception.
So Jia need to do something like below
/*
* if ((%ra == 0xffffffff || %rb == 0x80000000) && (sr_ove == 0))
* goto lab3;
*
* lab3:
* compute %ra/%rb but do NOT cause host failed?
*/
tcg_gen_ori_tl(cpu_sr, cpu_sr, SR_OV);
tcg_gen_ori_tl(cpu_sr, cpu_sr, SR_CY);
tcg_gen_brcondi_tl(TCG_COND_NE, sr_ove, SR_OVE, lab3);
gen_exception(dc, EXCP_RANGE);
gen_set_label(lab2);
tcg_gen_div_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
gen_set_label(lab3);
???
How can this be done?
Regards,
chenwj
--
Wei-Ren Chen (陳韋任)
Computer Systems Lab, Institute of Information Science,
Academia Sinica, Taiwan (R.O.C.)
Tel:886-2-2788-3799 #1667
Homepage: http://people.cs.nctu.edu.tw/~chenwj