Linux Audio

Check our new training course

Loading...
v6.2
  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 */
v6.8
  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 */