inline uint16_t
__BS(read_2)(void *v, bus_space_handle_t h, bus_size_t off)
{
#if CHIP_ACCESS_SIZE > 2
	volatile CHIP_TYPE *ptr;
#else	/* CHIP_ACCESS_SIZE > 2 */
	volatile uint16_t *ptr;
#endif	/* CHIP_ACCESS_SIZE > 2 */

	ptr = (void *)(h + CHIP_OFF16(off));
	return CHIP_SWAP16(*ptr) & 0xffff;
}
inline void
__BS(write_2)(void *v, bus_space_handle_t h, bus_size_t off, uint16_t val)
{
#if CHIP_ACCESS_SIZE > 2
	volatile CHIP_TYPE *ptr;
#else	/* CHIP_ACCESS_SIZE > 2 */
	volatile uint16_t *ptr;
#endif	/* CHIP_ACCESS_SIZE > 2 */

	ptr = (void *)(h + CHIP_OFF16(off));
	*ptr = CHIP_SWAP16(val);
}
static uint16_t
__BS(read_stream_2)(void *v, bus_space_handle_t h, bus_size_t off)
{
	h += CHIP_OFF16(off);
#if CHIP_ACCESS_SIZE == 8
	return (uint16_t)mips3_ld(h);
#elif CHIP_ACCESS_SIZE == 4
	return (uint16_t)mips_lwu(h);
#else
	return (uint16_t)mips_lbu(h);
#endif
}
static uint16_t
__BS(read_2)(void *v, bus_space_handle_t h, bus_size_t off)
{
	KASSERT((off & 1) == 0);
	h += CHIP_OFF16(off);

	const int shift = (h & (CHIP_ACCESS_SIZE - 1)) * 8;
	h &= ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1));
#if CHIP_ACCESS_SIZE == 8
	const CHIP_TYPE val = mips3_ld(h);
#elif CHIP_ACCESS_SIZE == 4
	const CHIP_TYPE val = mips_lwu(h);
#else
	const uint16_t val = mips_lhu(h);
#endif
	const uint16_t r = (uint16_t)CHIP_SWAP16(val >> shift);

	return r;
}
static void
__BS(write_2)(void *v, bus_space_handle_t h, bus_size_t off, uint16_t val)
{
	KASSERT((h & 1) == 0);
	KASSERT((off & 1) == 0);

	h += CHIP_OFF16(off);
#if CHIP_ACCES_SIZE <= 2
	mips_sh(h, CHIP_SWAP16(val));
#else
	const int shift = (h & (CHIP_ACCESS_SIZE - 1)) * 8;
	h &= ~((bus_space_handle_t)(CHIP_ACCESS_SIZE - 1));
	CHIP_TYPE cval = ((CHIP_TYPE)CHIP_SWAP16(val)) << shift;
# if CHIP_ACCESS_SIZE == 8
	mips3_sd(h, val);
# else
	mips_sw(h, val);
# endif
#endif
}