Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/xtensa/include/asm/asmmacro.h
15126 views
1
/*
2
* include/asm-xtensa/asmmacro.h
3
*
4
* This file is subject to the terms and conditions of the GNU General Public
5
* License. See the file "COPYING" in the main directory of this archive
6
* for more details.
7
*
8
* Copyright (C) 2005 Tensilica Inc.
9
*/
10
11
#ifndef _XTENSA_ASMMACRO_H
12
#define _XTENSA_ASMMACRO_H
13
14
#include <variant/core.h>
15
16
/*
17
* Some little helpers for loops. Use zero-overhead-loops
18
* where applicable and if supported by the processor.
19
*
20
* __loopi ar, at, size, inc
21
* ar register initialized with the start address
22
* at scratch register used by macro
23
* size size immediate value
24
* inc increment
25
*
26
* __loops ar, as, at, inc_log2[, mask_log2][, cond][, ncond]
27
* ar register initialized with the start address
28
* as register initialized with the size
29
* at scratch register use by macro
30
* inc_log2 increment [in log2]
31
* mask_log2 mask [in log2]
32
* cond true condition (used in loop'cond')
33
* ncond false condition (used in b'ncond')
34
*
35
* __loop as
36
* restart loop. 'as' register must not have been modified!
37
*
38
* __endla ar, at, incr
39
* ar start address (modified)
40
* as scratch register used by macro
41
* inc increment
42
*/
43
44
/*
45
* loop for given size as immediate
46
*/
47
48
.macro __loopi ar, at, size, incr
49
50
#if XCHAL_HAVE_LOOPS
51
movi \at, ((\size + \incr - 1) / (\incr))
52
loop \at, 99f
53
#else
54
addi \at, \ar, \size
55
98:
56
#endif
57
58
.endm
59
60
/*
61
* loop for given size in register
62
*/
63
64
.macro __loops ar, as, at, incr_log2, mask_log2, cond, ncond
65
66
#if XCHAL_HAVE_LOOPS
67
.ifgt \incr_log2 - 1
68
addi \at, \as, (1 << \incr_log2) - 1
69
.ifnc \mask_log2,
70
extui \at, \at, \incr_log2, \mask_log2
71
.else
72
srli \at, \at, \incr_log2
73
.endif
74
.endif
75
loop\cond \at, 99f
76
#else
77
.ifnc \mask_log2,
78
extui \at, \as, \incr_log2, \mask_log2
79
.else
80
.ifnc \ncond,
81
srli \at, \as, \incr_log2
82
.endif
83
.endif
84
.ifnc \ncond,
85
b\ncond \at, 99f
86
87
.endif
88
.ifnc \mask_log2,
89
slli \at, \at, \incr_log2
90
add \at, \ar, \at
91
.else
92
add \at, \ar, \as
93
.endif
94
#endif
95
98:
96
97
.endm
98
99
/*
100
* loop from ar to ax
101
*/
102
103
.macro __loopt ar, as, at, incr_log2
104
105
#if XCHAL_HAVE_LOOPS
106
sub \at, \as, \ar
107
.ifgt \incr_log2 - 1
108
addi \at, \at, (1 << \incr_log2) - 1
109
srli \at, \at, \incr_log2
110
.endif
111
loop \at, 99f
112
#else
113
98:
114
#endif
115
116
.endm
117
118
/*
119
* restart loop. registers must be unchanged
120
*/
121
122
.macro __loop as
123
124
#if XCHAL_HAVE_LOOPS
125
loop \as, 99f
126
#else
127
98:
128
#endif
129
130
.endm
131
132
/*
133
* end of loop with no increment of the address.
134
*/
135
136
.macro __endl ar, as
137
#if !XCHAL_HAVE_LOOPS
138
bltu \ar, \as, 98b
139
#endif
140
99:
141
.endm
142
143
/*
144
* end of loop with increment of the address.
145
*/
146
147
.macro __endla ar, as, incr
148
addi \ar, \ar, \incr
149
__endl \ar \as
150
.endm
151
152
153
#endif /* _XTENSA_ASMMACRO_H */
154
155