202 lines
3.9 KiB
C
202 lines
3.9 KiB
C
|
/* 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 */
|