18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
48c2ecf20Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
58c2ecf20Sopenharmony_ci * for more details.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (C) 1996, 99, 2003 by Ralf Baechle
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci#ifndef _ASM_SWAB_H
108c2ecf20Sopenharmony_ci#define _ASM_SWAB_H
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/compiler.h>
138c2ecf20Sopenharmony_ci#include <linux/types.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define __SWAB_64_THRU_32__
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#if !defined(__mips16) &&					\
188c2ecf20Sopenharmony_ci	((defined(__mips_isa_rev) && (__mips_isa_rev >= 2)) ||	\
198c2ecf20Sopenharmony_ci	 defined(_MIPS_ARCH_LOONGSON3A))
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistatic inline __attribute_const__ __u16 __arch_swab16(__u16 x)
228c2ecf20Sopenharmony_ci{
238c2ecf20Sopenharmony_ci	__asm__(
248c2ecf20Sopenharmony_ci	"	.set	push			\n"
258c2ecf20Sopenharmony_ci	"	.set	arch=mips32r2		\n"
268c2ecf20Sopenharmony_ci	"	wsbh	%0, %1			\n"
278c2ecf20Sopenharmony_ci	"	.set	pop			\n"
288c2ecf20Sopenharmony_ci	: "=r" (x)
298c2ecf20Sopenharmony_ci	: "r" (x));
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	return x;
328c2ecf20Sopenharmony_ci}
338c2ecf20Sopenharmony_ci#define __arch_swab16 __arch_swab16
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic inline __attribute_const__ __u32 __arch_swab32(__u32 x)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci	__asm__(
388c2ecf20Sopenharmony_ci	"	.set	push			\n"
398c2ecf20Sopenharmony_ci	"	.set	arch=mips32r2		\n"
408c2ecf20Sopenharmony_ci	"	wsbh	%0, %1			\n"
418c2ecf20Sopenharmony_ci	"	rotr	%0, %0, 16		\n"
428c2ecf20Sopenharmony_ci	"	.set	pop			\n"
438c2ecf20Sopenharmony_ci	: "=r" (x)
448c2ecf20Sopenharmony_ci	: "r" (x));
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	return x;
478c2ecf20Sopenharmony_ci}
488c2ecf20Sopenharmony_ci#define __arch_swab32 __arch_swab32
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci/*
518c2ecf20Sopenharmony_ci * Having already checked for MIPS R2, enable the optimized version for
528c2ecf20Sopenharmony_ci * 64-bit kernel on r2 CPUs.
538c2ecf20Sopenharmony_ci */
548c2ecf20Sopenharmony_ci#ifdef __mips64
558c2ecf20Sopenharmony_cistatic inline __attribute_const__ __u64 __arch_swab64(__u64 x)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	__asm__(
588c2ecf20Sopenharmony_ci	"	.set	push			\n"
598c2ecf20Sopenharmony_ci	"	.set	arch=mips64r2		\n"
608c2ecf20Sopenharmony_ci	"	dsbh	%0, %1			\n"
618c2ecf20Sopenharmony_ci	"	dshd	%0, %0			\n"
628c2ecf20Sopenharmony_ci	"	.set	pop			\n"
638c2ecf20Sopenharmony_ci	: "=r" (x)
648c2ecf20Sopenharmony_ci	: "r" (x));
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci	return x;
678c2ecf20Sopenharmony_ci}
688c2ecf20Sopenharmony_ci#define __arch_swab64 __arch_swab64
698c2ecf20Sopenharmony_ci#endif /* __mips64 */
708c2ecf20Sopenharmony_ci#endif /* (not __mips16) and (MIPS R2 or newer or Loongson 3A) */
718c2ecf20Sopenharmony_ci#endif /* _ASM_SWAB_H */
72