| /* 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 |
| |
| /* Annotate a function as being unsuitable for kprobes. */ |
| #ifdef CONFIG_KPROBES |
| #define _ASM_NOKPROBE(name) \ |
| .pushsection "_kprobe_blacklist", "aw"; \ |
| .quad name; \ |
| .popsection |
| #else |
| #define _ASM_NOKPROBE(name) |
| #endif |
| |
| #endif /* __ASM_ASM_H */ |