Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/loongarch/include/asm/asm.h
26488 views
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_SLL slli.w
76
#define INT_SLLV sll.w
77
#define INT_SRL srli.w
78
#define INT_SRLV srl.w
79
#define INT_SRA 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_SLL slli.d
90
#define INT_SLLV sll.d
91
#define INT_SRL srli.d
92
#define INT_SRLV srl.d
93
#define INT_SRA 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_SUB sub.w
104
#define LONG_L ld.w
105
#define LONG_S st.w
106
#define LONG_SLL slli.w
107
#define LONG_SLLV sll.w
108
#define LONG_SRL srli.w
109
#define LONG_SRLV srl.w
110
#define LONG_SRA srai.w
111
#define LONG_SRAV sra.w
112
113
#ifdef __ASSEMBLER__
114
#define LONG .word
115
#endif
116
#define LONGSIZE 4
117
#define LONGMASK 3
118
#define LONGLOG 2
119
#endif
120
121
#if (__SIZEOF_LONG__ == 8)
122
#define LONG_ADD add.d
123
#define LONG_ADDI addi.d
124
#define LONG_SUB sub.d
125
#define LONG_L ld.d
126
#define LONG_S st.d
127
#define LONG_SLL slli.d
128
#define LONG_SLLV sll.d
129
#define LONG_SRL srli.d
130
#define LONG_SRLV srl.d
131
#define LONG_SRA srai.d
132
#define LONG_SRAV sra.d
133
134
#ifdef __ASSEMBLER__
135
#define LONG .dword
136
#endif
137
#define LONGSIZE 8
138
#define LONGMASK 7
139
#define LONGLOG 3
140
#endif
141
142
/*
143
* How to add/sub/load/store/shift pointers.
144
*/
145
#if (__SIZEOF_POINTER__ == 4)
146
#define PTR_ADD add.w
147
#define PTR_ADDI addi.w
148
#define PTR_SUB sub.w
149
#define PTR_L ld.w
150
#define PTR_S st.w
151
#define PTR_LI li.w
152
#define PTR_SLL slli.w
153
#define PTR_SLLV sll.w
154
#define PTR_SRL srli.w
155
#define PTR_SRLV srl.w
156
#define PTR_SRA srai.w
157
#define PTR_SRAV sra.w
158
159
#define PTR_SCALESHIFT 2
160
161
#ifdef __ASSEMBLER__
162
#define PTR .word
163
#endif
164
#define PTRSIZE 4
165
#define PTRLOG 2
166
#endif
167
168
#if (__SIZEOF_POINTER__ == 8)
169
#define PTR_ADD add.d
170
#define PTR_ADDI addi.d
171
#define PTR_SUB sub.d
172
#define PTR_L ld.d
173
#define PTR_S st.d
174
#define PTR_LI li.d
175
#define PTR_SLL slli.d
176
#define PTR_SLLV sll.d
177
#define PTR_SRL srli.d
178
#define PTR_SRLV srl.d
179
#define PTR_SRA srai.d
180
#define PTR_SRAV sra.d
181
182
#define PTR_SCALESHIFT 3
183
184
#ifdef __ASSEMBLER__
185
#define PTR .dword
186
#endif
187
#define PTRSIZE 8
188
#define PTRLOG 3
189
#endif
190
191
/* Annotate a function as being unsuitable for kprobes. */
192
#ifdef CONFIG_KPROBES
193
#define _ASM_NOKPROBE(name) \
194
.pushsection "_kprobe_blacklist", "aw"; \
195
.quad name; \
196
.popsection
197
#else
198
#define _ASM_NOKPROBE(name)
199
#endif
200
201
#endif /* __ASM_ASM_H */
202
203