Loading...
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 __ASSEMBLY__
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 __ASSEMBLY__
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 __ASSEMBLY__
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 __ASSEMBLY__
185#define PTR .dword
186#endif
187#define PTRSIZE 8
188#define PTRLOG 3
189#endif
190
191#endif /* __ASM_ASM_H */
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 __ASSEMBLY__
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 __ASSEMBLY__
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 __ASSEMBLY__
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 __ASSEMBLY__
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 */