/* SPDX-License-Identifier: GPL-2.0 */ /* * Some useful macros for LoongArch assembler code * * Copyright (C) 2020-2022 Loongson Technology Corporation Limited * * Derived from MIPS: * Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle * Copyright (C) 1999 by Silicon Graphics, Inc. * Copyright (C) 2001 MIPS Technologies, Inc. * Copyright (C) 2002 Maciej W. Rozycki */ #ifndef __ASM_ASM_H #define __ASM_ASM_H /* LoongArch pref instruction. */ #ifdef CONFIG_CPU_HAS_PREFETCH #define PREF(hint, addr, offs) \ preld hint, addr, offs; \ #define PREFX(hint, addr, index) \ preldx hint, addr, index; \ #else /* !CONFIG_CPU_HAS_PREFETCH */ #define PREF(hint, addr, offs) #define PREFX(hint, addr, index) #endif /* !CONFIG_CPU_HAS_PREFETCH */ /* * Stack alignment */ #define STACK_ALIGN ~(0xf) /* * Macros to handle different pointer/register sizes for 32/64-bit code */ /* * Size of a register */ #ifndef __loongarch64 #define SZREG 4 #else #define SZREG 8 #endif /* * Use the following macros in assemblercode to load/store registers, * pointers etc. */ #if (SZREG == 4) #define REG_L ld.w #define REG_S st.w #define REG_ADD add.w #define REG_SUB sub.w #else /* SZREG == 8 */ #define REG_L ld.d #define REG_S st.d #define REG_ADD add.d #define REG_SUB sub.d #endif /* * How to add/sub/load/store/shift C int variables. */ #if (__SIZEOF_INT__ == 4) #define INT_ADD add.w #define INT_ADDI addi.w #define INT_SUB sub.w #define INT_L ld.w #define INT_S st.w #define INT_SLL slli.w #define INT_SLLV sll.w #define INT_SRL srli.w #define INT_SRLV srl.w #define INT_SRA srai.w #define INT_SRAV sra.w #endif #if (__SIZEOF_INT__ == 8) #define INT_ADD add.d #define INT_ADDI addi.d #define INT_SUB sub.d #define INT_L ld.d #define INT_S st.d #define INT_SLL slli.d #define INT_SLLV sll.d #define INT_SRL srli.d #define INT_SRLV srl.d #define INT_SRA srai.d #define INT_SRAV sra.d #endif /* * How to add/sub/load/store/shift C long variables. */ #if (__SIZEOF_LONG__ == 4) #define LONG_ADD add.w #define LONG_ADDI addi.w #define LONG_SUB sub.w #define LONG_L ld.w #define LONG_S st.w #define LONG_SLL slli.w #define LONG_SLLV sll.w #define LONG_SRL srli.w #define LONG_SRLV srl.w #define LONG_SRA srai.w #define LONG_SRAV sra.w #ifdef __ASSEMBLY__ #define LONG .word #endif #define LONGSIZE 4 #define LONGMASK 3 #define LONGLOG 2 #endif #if (__SIZEOF_LONG__ == 8) #define LONG_ADD add.d #define LONG_ADDI addi.d #define LONG_SUB sub.d #define LONG_L ld.d #define LONG_S st.d #define LONG_SLL slli.d #define LONG_SLLV sll.d #define LONG_SRL srli.d #define LONG_SRLV srl.d #define LONG_SRA srai.d #define LONG_SRAV sra.d #ifdef __ASSEMBLY__ #define LONG .dword #endif #define LONGSIZE 8 #define LONGMASK 7 #define LONGLOG 3 #endif /* * How to add/sub/load/store/shift pointers. */ #if (__SIZEOF_POINTER__ == 4) #define PTR_ADD add.w #define PTR_ADDI addi.w #define PTR_SUB sub.w #define PTR_L ld.w #define PTR_S st.w #define PTR_LI li.w #define PTR_SLL slli.w #define PTR_SLLV sll.w #define PTR_SRL srli.w #define PTR_SRLV srl.w #define PTR_SRA srai.w #define PTR_SRAV sra.w #define PTR_SCALESHIFT 2 #ifdef __ASSEMBLY__ #define PTR .word #endif #define PTRSIZE 4 #define PTRLOG 2 #endif #if (__SIZEOF_POINTER__ == 8) #define PTR_ADD add.d #define PTR_ADDI addi.d #define PTR_SUB sub.d #define PTR_L ld.d #define PTR_S st.d #define PTR_LI li.d #define PTR_SLL slli.d #define PTR_SLLV sll.d #define PTR_SRL srli.d #define PTR_SRLV srl.d #define PTR_SRA srai.d #define PTR_SRAV sra.d #define PTR_SCALESHIFT 3 #ifdef __ASSEMBLY__ #define PTR .dword #endif #define PTRSIZE 8 #define PTRLOG 3 #endif #endif /* __ASM_ASM_H */