_xrshr(jit_state_t *_jit, jit_bool_t sign,
jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
{
- jit_bool_t branch;
- jit_word_t over, zero, done, done_over;
- jit_int32_t t0, s0, t1, s1, t2, s2, t3, s3;
+ jit_int32_t t0, s0, t2, s2, t3, s3;
s0 = jit_get_reg(jit_class_gpr);
t0 = rn(s0);
if (r0 == r2 || r1 == r2) {
}
else
t3 = r3;
- if ((s1 = jit_get_reg(jit_class_gpr|jit_class_nospill|jit_class_chk))) {
- t1 = rn(s1);
- branch = 0;
- }
- else
- branch = 1;
- rsbi(t0, t3, __WORDSIZE);
- if (sign)
- rshr(r0, t2, t3);
- else
- rshr_u(r0, t2, t3);
- lshr(r1, t2, t0);
- if (branch) {
- zero = beqi(_jit->pc.w, t3, 0);
- over = beqi(_jit->pc.w, t3, __WORDSIZE);
- done = jmpi(_jit->pc.w);
- patch_at(over, _jit->pc.w);
- /* underflow */
- if (sign)
- rshi(r0, t2, __WORDSIZE - 1);
- else
- movi(r0, 0);
- done_over = jmpi(_jit->pc.w);
- /* zero */
- patch_at(zero, _jit->pc.w);
- if (sign)
- rshi(r1, t2, __WORDSIZE - 1);
- else
- movi(r1, 0);
- patch_at(done, _jit->pc.w);
- patch_at(done_over, _jit->pc.w);
- jit_unget_reg(s1);
+
+ if (sign) {
+ /* underflow? */
+ eqi(t0, t3, __WORDSIZE);
+ subr(t0, t3, t0);
+ rshr(r0, t2, t0);
}
else {
- /* zero? */
- if (sign)
- rshi(t0, t2, __WORDSIZE - 1);
- else
- movi(t0, 0);
- movzr(r1, t0, t3);
/* underflow? */
- eqi(t1, t3, __WORDSIZE);
- movnr(r0, t0, t1);
- jit_unget_reg(s1);
+ nei(t0, t3, __WORDSIZE);
+ rshr_u(r0, t2, t3);
+ movzr(r0, t0, t0);
}
+
+ rsbi(t0, t3, __WORDSIZE);
+ lshr(r1, t2, t0);
+
+ /* zero? */
+ movzr(r1, t3, t3);
+
jit_unget_reg(s0);
if (t2 != r2)
jit_unget_reg(s2);
{
if (i0 == 0) {
movr(r0, r2);
- if (sign)
- rshi(r1, r2, __WORDSIZE - 1);
- else
- movi(r1, 0);
+ movi(r1, 0);
}
else if (i0 == __WORDSIZE) {
movr(r1, r2);