David Gibson <da...@gibson.dropbear.id.au> writes: > [ Unknown signature status ] > On Wed, Nov 23, 2016 at 05:07:18PM +0530, Nikunj A Dadhania wrote: >> From: Avinesh Kumar <avine...@linux.vnet.ibm.com> >> >> vextublx: Vector Extract Unsigned Byte Left >> vextuhlx: Vector Extract Unsigned Halfword Left >> vextuwlx: Vector Extract Unsigned Word Left >> >> Signed-off-by: Avinesh Kumar <avine...@linux.vnet.ibm.com> >> Signed-off-by: Nikunj A Dadhania <nik...@linux.vnet.ibm.com> > > So, when I suggested doing these without helpers before, I had > forgotten that the non-byte versions can straddle the word boundary. > Given that the offset is in a register, not the instruction that does > make it complicated. > > But, this version also relies on working 128-bit arithmetic, AFAICT > this will just fail to build if CONFIG_INT128 isn't defined.
It has both the implementation, just that the defines might have confused you: #if defined(HOST_WORDS_BIGENDIAN) # if defined(CONFIG_INT128) # else # endif #else /* !defined (HOST_WORDS_BIGENDIAN) */ # if defined(CONFIG_INT128) # else # endif #endif > It really shouldn't be that hard to make a helper that works just in > terms of 64-bit arithmetic - there are only 3 cases (all in the upper > word, all in the lower, and straddling). Currently, its being done using byte array. +{ \ + target_ulong r = 0; \ + int i; \ + int index = a & 0xf; \ + for (i = 0; i < elem; i++) { \ + r = r << 8; \ + if (index + i <= 15) { \ + r = r | b->u8[index + i]; \ + } \ + } \ + return r; \ +} > I'd prefer to see it done that way, rather than increasing reliance on > CONFIG_INT128. Regards Nikunj