- 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);