]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/bcm64/cache.v8.s
amd64: FP: always use enough to fit AVX state and align to 64 bytes
[plan9front.git] / sys / src / 9 / bcm64 / cache.v8.s
1 #include "sysreg.h"
2
3 #undef  SYSREG
4 #define SYSREG(op0,op1,Cn,Cm,op2)       SPR(((op0)<<19|(op1)<<16|(Cn)<<12|(Cm)<<8|(op2)<<5))
5
6 /*
7  * instruction cache operations
8  */
9 TEXT cacheiinvse(SB), 1, $-4
10         MOVWU   len+8(FP), R2
11         ADD     R0, R2
12
13         MRS     DAIF, R11
14         MSR     $0x2, DAIFSet
15         MOVWU   $1, R10
16         MSR     R10, CSSELR_EL1
17         ISB     $SY
18         MRS     CCSIDR_EL1, R4
19
20         ANDW    $7, R4
21         ADDW    $4, R4          // log2(linelen)
22         LSL     R4, R10
23         LSR     R4, R0
24         LSL     R4, R0
25
26 _iinvse:
27         IC      R0, 3,7,5,1     // IVAU
28         ADD     R10, R0
29         CMP     R0, R2
30         BGT     _iinvse
31         DSB     $NSH
32         ISB     $SY
33         MSR     R11, DAIF
34         RETURN
35
36 TEXT cacheiinv(SB), 1, $-4
37         IC      R0, 0,7,5,0     // IALLU
38         DSB     $NSH
39         ISB     $SY
40         RETURN
41
42 TEXT cacheuwbinv(SB), 1, $0
43         BL      cachedwbinv(SB)
44         BL      cacheiinv(SB)
45         RETURN
46
47 /*
48  * data cache operations
49  */
50 TEXT cachedwbse(SB), 1, $-4
51         MOV     LR, R29
52         BL      cachedva<>(SB)
53 TEXT dccvac(SB), 1, $-4
54         DC      R0, 3,7,10,1    // CVAC
55         RETURN
56
57 TEXT cacheduwbse(SB), 1, $-4
58         MOV     LR, R29
59         BL      cachedva<>(SB)
60 TEXT dccvau(SB), 1, $-4
61         DC      R0, 3,7,11,1    // CVAU
62         RETURN
63
64 TEXT cachedinvse(SB), 1, $-4
65         MOV     LR, R29
66         BL      cachedva<>(SB)
67 TEXT dcivac(SB), 1, $-4
68         DC      R0, 0,7,6,1     // IVAC
69         RETURN
70
71 TEXT cachedwbinvse(SB), 1, $-4
72         MOV     LR, R29
73         BL      cachedva<>(SB)
74 TEXT dccivac(SB), 1, $-4
75         DC      R0, 3,7,14,1    // CIVAC
76         RETURN
77
78 TEXT cachedva<>(SB), 1, $-4
79         MOV     LR, R1
80         MOVWU   len+8(FP), R2
81         ADD     R0, R2
82
83         MRS     DAIF, R11
84         MSR     $0x2, DAIFSet
85         MOVWU   $0, R10
86         MSR     R10, CSSELR_EL1
87         ISB     $SY
88         MRS     CCSIDR_EL1, R4
89
90         ANDW    $7, R4
91         ADDW    $4, R4          // log2(linelen)
92         MOVWU   $1, R10
93         LSL     R4, R10
94         LSR     R4, R0
95         LSL     R4, R0
96
97         DSB     $SY
98         ISB     $SY
99 _cachedva:
100         BL      (R1)
101         ADD     R10, R0
102         CMP     R0, R2
103         BGT     _cachedva
104         DSB     $SY
105         ISB     $SY
106         MSR     R11, DAIF
107         RET     R29
108
109 /*
110  * l1 cache operations
111  */
112 TEXT cachedwb(SB), 1, $-4
113         MOVWU   $0, R0
114 _cachedwb:
115         MOV     LR, R29
116         BL      cachedsw<>(SB)
117 TEXT dccsw(SB), 1, $-4
118         DC      R0, 0,7,10,2    // CSW
119         RETURN
120
121 TEXT cachedinv(SB), 1, $-4
122         MOVWU   $0, R0
123 _cachedinv:
124         MOV     LR, R29
125         BL      cachedsw<>(SB)
126 TEXT dcisw(SB), 1, $-4
127         DC      R0, 0,7,6,2     // ISW
128         RETURN
129
130 TEXT cachedwbinv(SB), 1, $-4
131         MOVWU   $0, R0
132 _cachedwbinv:
133         MOV     LR, R29
134         BL      cachedsw<>(SB)
135 TEXT dccisw(SB), 1, $-4
136         DC      R0, 0,7,14,2    // CISW
137         RETURN
138
139 /*
140  * l2 cache operations
141  */
142 TEXT l2cacheuwb(SB), 1, $-4
143         MOVWU   $1, R0
144         B       _cachedwb
145 TEXT l2cacheuinv(SB), 1, $-4
146         MOVWU   $1, R0
147         B       _cachedinv
148 TEXT l2cacheuwbinv(SB), 1, $-4
149         MOVWU   $1, R0
150         B       _cachedwbinv
151
152 TEXT cachesize(SB), 1, $-4
153         MRS     DAIF, R11
154         MSR     $0x2, DAIFSet
155         MSR     R0, CSSELR_EL1
156         ISB     $SY
157         MRS     CCSIDR_EL1, R0
158         MSR     R11, DAIF
159         RETURN
160
161 TEXT cachedsw<>(SB), 1, $-4
162         MOV     LR, R1
163
164         MRS     DAIF, R11
165         MSR     $0x2, DAIFSet
166         ADDW    R0, R0, R8
167         MSR     R8, CSSELR_EL1
168         ISB     $SY
169         MRS     CCSIDR_EL1, R4
170
171         LSR     $3, R4, R7
172         ANDW    $1023, R7       // lastway
173         ADDW    $1, R7, R5      // #ways
174
175         LSR     $13, R4, R2
176         ANDW    $32767, R2      // lastset
177         ADDW    $1, R2          // #sets
178
179         ANDW    $7, R4
180         ADDW    $4, R4          // log2(linelen)
181
182         MOVWU   $32, R3         // wayshift = 32 - log2(#ways)
183 _countlog2ways:
184         CBZ     R7, _loop       // lastway == 0?
185         LSR     $1, R7          // lastway >>= 1
186         SUB     $1, R3          // wayshift--
187         B _countlog2ways
188 _loop:
189         DSB     $SY
190         ISB     $SY
191 _nextway:
192         MOVWU   $0, R6          // set
193 _nextset:
194         LSL     R3, R7, R0      // way<<wayshift
195         LSL     R4, R6, R9      // set<<log2(linelen)
196         ORRW    R8, R0          // level
197         ORRW    R9, R0          // setway
198
199         BL      (R1)            // op(setway)
200
201         ADDW    $1, R6          // set++
202         CMPW    R2, R6
203         BLT     _nextset
204
205         ADDW    $1, R7          // way++
206         CMPW    R5, R7
207         BLT     _nextway
208
209         DSB     $SY
210         ISB     $SY
211         MSR     R11, DAIF
212         RET     R29