void do_reloc32()

in kernel/module.c [58:87]


void do_reloc32(unsigned int val, unsigned int *loc, unsigned int val_mask,
		unsigned int val_shift, unsigned int loc_mask,
		unsigned int partial_in_place, unsigned int swap)
{
	unsigned int tmp = 0, tmp2 = 0;

	__asm__ __volatile__("\tlmw.bi\t%0, [%2], %0, 0\n"
			     "\tbeqz\t%3, 1f\n"
			     "\twsbh\t%0, %1\n"
			     "\trotri\t%0, %1, 16\n"
			     "1:\n":"=r"(tmp):"0"(tmp), "r"(loc), "r"(swap)
	    );

	tmp2 = tmp & loc_mask;
	if (partial_in_place) {
		tmp &= (~loc_mask);
		tmp =
		    tmp2 | ((tmp + ((val & val_mask) >> val_shift)) & val_mask);
	} else {
		tmp = tmp2 | ((val & val_mask) >> val_shift);
	}

	__asm__ __volatile__("\tbeqz\t%3, 2f\n"
			     "\twsbh\t%0, %1\n"
			     "\trotri\t%0, %1, 16\n"
			     "2:\n"
			     "\tsmw.bi\t%0, [%2], %0, 0\n":"=r"(tmp):"0"(tmp),
			     "r"(loc), "r"(swap)
	    );
}