123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /* 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 */
|