/* accelerated versions (and 21264 assembly versions ) contributed by Rick Gorton  */
static unsigned short from64to16(unsigned long x)
/* accelerated versions (and 21264 assembly versions ) contributed by Rick Gorton  */
static unsigned short from64to16(unsigned long x)
{
	union {
		unsigned long	ul;
		unsigned int	ui[2];
		unsigned short	us[4];
	} in_v, tmp_v, out_v;
	in_v.ul = x;
	tmp_v.ul = (unsigned long) in_v.ui[0] + (unsigned long) in_v.ui[1];
	out_v.ul = (unsigned long) tmp_v.us[0] + (unsigned long) tmp_v.us[1]
			+ (unsigned long) tmp_v.us[2];
	return out_v.us[0] + out_v.us[1];
}