162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Some useful macros for LoongArch assembler code 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Derived from MIPS: 862306a36Sopenharmony_ci * Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle 962306a36Sopenharmony_ci * Copyright (C) 1999 by Silicon Graphics, Inc. 1062306a36Sopenharmony_ci * Copyright (C) 2001 MIPS Technologies, Inc. 1162306a36Sopenharmony_ci * Copyright (C) 2002 Maciej W. Rozycki 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci#ifndef __ASM_ASM_H 1462306a36Sopenharmony_ci#define __ASM_ASM_H 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* LoongArch pref instruction. */ 1762306a36Sopenharmony_ci#ifdef CONFIG_CPU_HAS_PREFETCH 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define PREF(hint, addr, offs) \ 2062306a36Sopenharmony_ci preld hint, addr, offs; \ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define PREFX(hint, addr, index) \ 2362306a36Sopenharmony_ci preldx hint, addr, index; \ 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#else /* !CONFIG_CPU_HAS_PREFETCH */ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define PREF(hint, addr, offs) 2862306a36Sopenharmony_ci#define PREFX(hint, addr, index) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#endif /* !CONFIG_CPU_HAS_PREFETCH */ 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * Stack alignment 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ci#define STACK_ALIGN ~(0xf) 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/* 3862306a36Sopenharmony_ci * Macros to handle different pointer/register sizes for 32/64-bit code 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* 4262306a36Sopenharmony_ci * Size of a register 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci#ifndef __loongarch64 4562306a36Sopenharmony_ci#define SZREG 4 4662306a36Sopenharmony_ci#else 4762306a36Sopenharmony_ci#define SZREG 8 4862306a36Sopenharmony_ci#endif 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* 5162306a36Sopenharmony_ci * Use the following macros in assemblercode to load/store registers, 5262306a36Sopenharmony_ci * pointers etc. 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_ci#if (SZREG == 4) 5562306a36Sopenharmony_ci#define REG_L ld.w 5662306a36Sopenharmony_ci#define REG_S st.w 5762306a36Sopenharmony_ci#define REG_ADD add.w 5862306a36Sopenharmony_ci#define REG_SUB sub.w 5962306a36Sopenharmony_ci#else /* SZREG == 8 */ 6062306a36Sopenharmony_ci#define REG_L ld.d 6162306a36Sopenharmony_ci#define REG_S st.d 6262306a36Sopenharmony_ci#define REG_ADD add.d 6362306a36Sopenharmony_ci#define REG_SUB sub.d 6462306a36Sopenharmony_ci#endif 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* 6762306a36Sopenharmony_ci * How to add/sub/load/store/shift C int variables. 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ci#if (__SIZEOF_INT__ == 4) 7062306a36Sopenharmony_ci#define INT_ADD add.w 7162306a36Sopenharmony_ci#define INT_ADDI addi.w 7262306a36Sopenharmony_ci#define INT_SUB sub.w 7362306a36Sopenharmony_ci#define INT_L ld.w 7462306a36Sopenharmony_ci#define INT_S st.w 7562306a36Sopenharmony_ci#define INT_SLL slli.w 7662306a36Sopenharmony_ci#define INT_SLLV sll.w 7762306a36Sopenharmony_ci#define INT_SRL srli.w 7862306a36Sopenharmony_ci#define INT_SRLV srl.w 7962306a36Sopenharmony_ci#define INT_SRA srai.w 8062306a36Sopenharmony_ci#define INT_SRAV sra.w 8162306a36Sopenharmony_ci#endif 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#if (__SIZEOF_INT__ == 8) 8462306a36Sopenharmony_ci#define INT_ADD add.d 8562306a36Sopenharmony_ci#define INT_ADDI addi.d 8662306a36Sopenharmony_ci#define INT_SUB sub.d 8762306a36Sopenharmony_ci#define INT_L ld.d 8862306a36Sopenharmony_ci#define INT_S st.d 8962306a36Sopenharmony_ci#define INT_SLL slli.d 9062306a36Sopenharmony_ci#define INT_SLLV sll.d 9162306a36Sopenharmony_ci#define INT_SRL srli.d 9262306a36Sopenharmony_ci#define INT_SRLV srl.d 9362306a36Sopenharmony_ci#define INT_SRA srai.d 9462306a36Sopenharmony_ci#define INT_SRAV sra.d 9562306a36Sopenharmony_ci#endif 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/* 9862306a36Sopenharmony_ci * How to add/sub/load/store/shift C long variables. 9962306a36Sopenharmony_ci */ 10062306a36Sopenharmony_ci#if (__SIZEOF_LONG__ == 4) 10162306a36Sopenharmony_ci#define LONG_ADD add.w 10262306a36Sopenharmony_ci#define LONG_ADDI addi.w 10362306a36Sopenharmony_ci#define LONG_SUB sub.w 10462306a36Sopenharmony_ci#define LONG_L ld.w 10562306a36Sopenharmony_ci#define LONG_S st.w 10662306a36Sopenharmony_ci#define LONG_SLL slli.w 10762306a36Sopenharmony_ci#define LONG_SLLV sll.w 10862306a36Sopenharmony_ci#define LONG_SRL srli.w 10962306a36Sopenharmony_ci#define LONG_SRLV srl.w 11062306a36Sopenharmony_ci#define LONG_SRA srai.w 11162306a36Sopenharmony_ci#define LONG_SRAV sra.w 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#ifdef __ASSEMBLY__ 11462306a36Sopenharmony_ci#define LONG .word 11562306a36Sopenharmony_ci#endif 11662306a36Sopenharmony_ci#define LONGSIZE 4 11762306a36Sopenharmony_ci#define LONGMASK 3 11862306a36Sopenharmony_ci#define LONGLOG 2 11962306a36Sopenharmony_ci#endif 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#if (__SIZEOF_LONG__ == 8) 12262306a36Sopenharmony_ci#define LONG_ADD add.d 12362306a36Sopenharmony_ci#define LONG_ADDI addi.d 12462306a36Sopenharmony_ci#define LONG_SUB sub.d 12562306a36Sopenharmony_ci#define LONG_L ld.d 12662306a36Sopenharmony_ci#define LONG_S st.d 12762306a36Sopenharmony_ci#define LONG_SLL slli.d 12862306a36Sopenharmony_ci#define LONG_SLLV sll.d 12962306a36Sopenharmony_ci#define LONG_SRL srli.d 13062306a36Sopenharmony_ci#define LONG_SRLV srl.d 13162306a36Sopenharmony_ci#define LONG_SRA srai.d 13262306a36Sopenharmony_ci#define LONG_SRAV sra.d 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci#ifdef __ASSEMBLY__ 13562306a36Sopenharmony_ci#define LONG .dword 13662306a36Sopenharmony_ci#endif 13762306a36Sopenharmony_ci#define LONGSIZE 8 13862306a36Sopenharmony_ci#define LONGMASK 7 13962306a36Sopenharmony_ci#define LONGLOG 3 14062306a36Sopenharmony_ci#endif 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci/* 14362306a36Sopenharmony_ci * How to add/sub/load/store/shift pointers. 14462306a36Sopenharmony_ci */ 14562306a36Sopenharmony_ci#if (__SIZEOF_POINTER__ == 4) 14662306a36Sopenharmony_ci#define PTR_ADD add.w 14762306a36Sopenharmony_ci#define PTR_ADDI addi.w 14862306a36Sopenharmony_ci#define PTR_SUB sub.w 14962306a36Sopenharmony_ci#define PTR_L ld.w 15062306a36Sopenharmony_ci#define PTR_S st.w 15162306a36Sopenharmony_ci#define PTR_LI li.w 15262306a36Sopenharmony_ci#define PTR_SLL slli.w 15362306a36Sopenharmony_ci#define PTR_SLLV sll.w 15462306a36Sopenharmony_ci#define PTR_SRL srli.w 15562306a36Sopenharmony_ci#define PTR_SRLV srl.w 15662306a36Sopenharmony_ci#define PTR_SRA srai.w 15762306a36Sopenharmony_ci#define PTR_SRAV sra.w 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci#define PTR_SCALESHIFT 2 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci#ifdef __ASSEMBLY__ 16262306a36Sopenharmony_ci#define PTR .word 16362306a36Sopenharmony_ci#endif 16462306a36Sopenharmony_ci#define PTRSIZE 4 16562306a36Sopenharmony_ci#define PTRLOG 2 16662306a36Sopenharmony_ci#endif 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci#if (__SIZEOF_POINTER__ == 8) 16962306a36Sopenharmony_ci#define PTR_ADD add.d 17062306a36Sopenharmony_ci#define PTR_ADDI addi.d 17162306a36Sopenharmony_ci#define PTR_SUB sub.d 17262306a36Sopenharmony_ci#define PTR_L ld.d 17362306a36Sopenharmony_ci#define PTR_S st.d 17462306a36Sopenharmony_ci#define PTR_LI li.d 17562306a36Sopenharmony_ci#define PTR_SLL slli.d 17662306a36Sopenharmony_ci#define PTR_SLLV sll.d 17762306a36Sopenharmony_ci#define PTR_SRL srli.d 17862306a36Sopenharmony_ci#define PTR_SRLV srl.d 17962306a36Sopenharmony_ci#define PTR_SRA srai.d 18062306a36Sopenharmony_ci#define PTR_SRAV sra.d 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci#define PTR_SCALESHIFT 3 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci#ifdef __ASSEMBLY__ 18562306a36Sopenharmony_ci#define PTR .dword 18662306a36Sopenharmony_ci#endif 18762306a36Sopenharmony_ci#define PTRSIZE 8 18862306a36Sopenharmony_ci#define PTRLOG 3 18962306a36Sopenharmony_ci#endif 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci/* Annotate a function as being unsuitable for kprobes. */ 19262306a36Sopenharmony_ci#ifdef CONFIG_KPROBES 19362306a36Sopenharmony_ci#define _ASM_NOKPROBE(name) \ 19462306a36Sopenharmony_ci .pushsection "_kprobe_blacklist", "aw"; \ 19562306a36Sopenharmony_ci .quad name; \ 19662306a36Sopenharmony_ci .popsection 19762306a36Sopenharmony_ci#else 19862306a36Sopenharmony_ci#define _ASM_NOKPROBE(name) 19962306a36Sopenharmony_ci#endif 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci#endif /* __ASM_ASM_H */ 202