On 14.02.2011 19:12, Peter Maydell wrote: > On 11 February 2011 15:10, <christophe.l...@st.com> wrote: >> +uint32_t HELPER(neon_rshl_s32)(uint32_t valop, uint32_t shiftop) >> +{ >> + int32_t dest; >> + int32_t val = (int32_t)valop; >> + int8_t shift = (int8_t)shiftop; >> + if (shift >= 32) { >> + dest = 0; >> + } else if (shift < -32) { >> + dest = val >> 31; > > This is the wrong answer: large rounding right shifts give zero. > >> + } else if (shift == -32) { >> + dest = val >> 31; >> + dest++; >> + dest >>= 1; > > These three lines will always result in dest becoming > 0 regardless of the input value. >
You are right. Actually, I just intended to fix the case where -32 < shift < 0, and merely re-instanciated the preceding macro with a known size of 32. You comments also apply to the 8 and 16 bits variants in that macro. I am too respectful of existing code :-) Christophe.