1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Some useful macros for LoongArch assembler code 4 * 5 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 6 * 7 * Derived from MIPS: 8 * Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle 9 * Copyright (C) 1999 by Silicon Graphics, Inc. 10 * Copyright (C) 2001 MIPS Technologies, Inc. 11 * Copyright (C) 2002 Maciej W. Rozycki 12 */ 13 #ifndef __ASM_ASM_H 14 #define __ASM_ASM_H 15 16 /* LoongArch pref instruction. */ 17 #ifdef CONFIG_CPU_HAS_PREFETCH 18 19 #define PREF(hint, addr, offs) \ 20 preld hint, addr, offs; \ 21 22 #define PREFX(hint, addr, index) \ 23 preldx hint, addr, index; \ 24 25 #else /* !CONFIG_CPU_HAS_PREFETCH */ 26 27 #define PREF(hint, addr, offs) 28 #define PREFX(hint, addr, index) 29 30 #endif /* !CONFIG_CPU_HAS_PREFETCH */ 31 32 /* 33 * Stack alignment 34 */ 35 #define STACK_ALIGN ~(0xf) 36 37 /* 38 * Macros to handle different pointer/register sizes for 32/64-bit code 39 */ 40 41 /* 42 * Size of a register 43 */ 44 #ifndef __loongarch64 45 #define SZREG 4 46 #else 47 #define SZREG 8 48 #endif 49 50 /* 51 * Use the following macros in assemblercode to load/store registers, 52 * pointers etc. 53 */ 54 #if (SZREG == 4) 55 #define REG_L ld.w 56 #define REG_S st.w 57 #define REG_ADD add.w 58 #define REG_SUB sub.w 59 #else /* SZREG == 8 */ 60 #define REG_L ld.d 61 #define REG_S st.d 62 #define REG_ADD add.d 63 #define REG_SUB sub.d 64 #endif 65 66 /* 67 * How to add/sub/load/store/shift C int variables. 68 */ 69 #if (__SIZEOF_INT__ == 4) 70 #define INT_ADD add.w 71 #define INT_ADDI addi.w 72 #define INT_SUB sub.w 73 #define INT_L ld.w 74 #define INT_S st.w 75 #define INT_SLLI slli.w 76 #define INT_SLLV sll.w 77 #define INT_SRLI srli.w 78 #define INT_SRLV srl.w 79 #define INT_SRAI srai.w 80 #define INT_SRAV sra.w 81 #endif 82 83 #if (__SIZEOF_INT__ == 8) 84 #define INT_ADD add.d 85 #define INT_ADDI addi.d 86 #define INT_SUB sub.d 87 #define INT_L ld.d 88 #define INT_S st.d 89 #define INT_SLLI slli.d 90 #define INT_SLLV sll.d 91 #define INT_SRLI srli.d 92 #define INT_SRLV srl.d 93 #define INT_SRAI srai.d 94 #define INT_SRAV sra.d 95 #endif 96 97 /* 98 * How to add/sub/load/store/shift C long variables. 99 */ 100 #if (__SIZEOF_LONG__ == 4) 101 #define LONG_ADD add.w 102 #define LONG_ADDI addi.w 103 #define LONG_ALSL alsl.w 104 #define LONG_BSTRINS bstrins.w 105 #define LONG_BSTRPICK bstrpick.w 106 #define LONG_SUB sub.w 107 #define LONG_L ld.w 108 #define LONG_LI li.w 109 #define LONG_LPTR ld.w 110 #define LONG_S st.w 111 #define LONG_SPTR st.w 112 #define LONG_SLLI slli.w 113 #define LONG_SLLV sll.w 114 #define LONG_SRLI srli.w 115 #define LONG_SRLV srl.w 116 #define LONG_SRAI srai.w 117 #define LONG_SRAV sra.w 118 #define LONG_ROTR rotr.w 119 #define LONG_ROTRI rotri.w 120 121 #ifdef __ASSEMBLER__ 122 #define LONG .word 123 #endif 124 #define LONGSIZE 4 125 #define LONGMASK 3 126 #define LONGLOG 2 127 #endif 128 129 #if (__SIZEOF_LONG__ == 8) 130 #define LONG_ADD add.d 131 #define LONG_ADDI addi.d 132 #define LONG_ALSL alsl.d 133 #define LONG_BSTRINS bstrins.d 134 #define LONG_BSTRPICK bstrpick.d 135 #define LONG_SUB sub.d 136 #define LONG_L ld.d 137 #define LONG_LI li.d 138 #define LONG_LPTR ldptr.d 139 #define LONG_S st.d 140 #define LONG_SPTR stptr.d 141 #define LONG_SLLI slli.d 142 #define LONG_SLLV sll.d 143 #define LONG_SRLI srli.d 144 #define LONG_SRLV srl.d 145 #define LONG_SRAI srai.d 146 #define LONG_SRAV sra.d 147 #define LONG_ROTR rotr.d 148 #define LONG_ROTRI rotri.d 149 150 #ifdef __ASSEMBLER__ 151 #define LONG .dword 152 #endif 153 #define LONGSIZE 8 154 #define LONGMASK 7 155 #define LONGLOG 3 156 #endif 157 158 /* 159 * How to add/sub/load/store/shift pointers. 160 */ 161 #if (__SIZEOF_POINTER__ == 4) 162 #define PTR_ADD add.w 163 #define PTR_ADDI addi.w 164 #define PTR_ALSL alsl.w 165 #define PTR_BSTRINS bstrins.w 166 #define PTR_BSTRPICK bstrpick.w 167 #define PTR_SUB sub.w 168 #define PTR_L ld.w 169 #define PTR_LI li.w 170 #define PTR_LPTR ld.w 171 #define PTR_S st.w 172 #define PTR_SPTR st.w 173 #define PTR_SLLI slli.w 174 #define PTR_SLLV sll.w 175 #define PTR_SRLI srli.w 176 #define PTR_SRLV srl.w 177 #define PTR_SRAI srai.w 178 #define PTR_SRAV sra.w 179 #define PTR_ROTR rotr.w 180 #define PTR_ROTRI rotri.w 181 182 #define PTR_SCALESHIFT 2 183 184 #ifdef __ASSEMBLER__ 185 #define PTR .word 186 #endif 187 #define PTRSIZE 4 188 #define PTRLOG 2 189 #endif 190 191 #if (__SIZEOF_POINTER__ == 8) 192 #define PTR_ADD add.d 193 #define PTR_ADDI addi.d 194 #define PTR_ALSL alsl.d 195 #define PTR_BSTRINS bstrins.d 196 #define PTR_BSTRPICK bstrpick.d 197 #define PTR_SUB sub.d 198 #define PTR_L ld.d 199 #define PTR_LI li.d 200 #define PTR_LPTR ldptr.d 201 #define PTR_S st.d 202 #define PTR_SPTR stptr.d 203 #define PTR_SLLI slli.d 204 #define PTR_SLLV sll.d 205 #define PTR_SRLI srli.d 206 #define PTR_SRLV srl.d 207 #define PTR_SRAI srai.d 208 #define PTR_SRAV sra.d 209 #define PTR_ROTR rotr.d 210 #define PTR_ROTRI rotri.d 211 212 #define PTR_SCALESHIFT 3 213 214 #ifdef __ASSEMBLER__ 215 #define PTR .dword 216 #endif 217 #define PTRSIZE 8 218 #define PTRLOG 3 219 #endif 220 221 /* Annotate a function as being unsuitable for kprobes. */ 222 #ifdef CONFIG_KPROBES 223 #ifdef CONFIG_32BIT 224 #define _ASM_NOKPROBE(name) \ 225 .pushsection "_kprobe_blacklist", "aw"; \ 226 .long name; \ 227 .popsection 228 #else 229 #define _ASM_NOKPROBE(name) \ 230 .pushsection "_kprobe_blacklist", "aw"; \ 231 .quad name; \ 232 .popsection 233 #endif 234 #else 235 #define _ASM_NOKPROBE(name) 236 #endif 237 238 #endif /* __ASM_ASM_H */ 239