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