Commit | Line | Data |
---|---|---|
4a71579b PC |
1 | #include "ldst.inc" |
2 | ||
3 | #if __WORDSIZE == 64 | |
4 | # define LDSTL(N, R0, R1, R2) \ | |
5 | movi %R2 $offui \ | |
6 | stxr_i %R2 %R0 %R1 \ | |
7 | movi %R1 L##N \ | |
8 | movi %R2 $offl \ | |
9 | stxr_l %R2 %R0 %R1 | |
10 | ||
11 | # define SI(C, N, x, X, R0, R1) \ | |
12 | movi %R1 $off##x \ | |
13 | ldxr_##x %R1 %R0 %R1 \ | |
14 | beqi L##x##C##0 %R1 L##X##N \ | |
15 | calli @abort \ | |
16 | L##x##C##0: \ | |
17 | movi %R1 $off##x \ | |
18 | ldxr_##x %R0 %R0 %R1 \ | |
19 | beqi L##x##C##1 %R0 L##X##N \ | |
20 | calli @abort \ | |
21 | L##x##C##1: | |
22 | ||
23 | # define LDRL(C, N, R0, R1, R2) \ | |
24 | UI(C, N, i, I, R0, R1) \ | |
25 | movi %R0 t0 \ | |
26 | SI(C, N, l, L, R0, R1) | |
27 | #else | |
28 | # define LDSTL(C, R0, R1, R2) | |
29 | # define SI(C, N, x, X, R0, R1) \ | |
30 | movi %R1 $off##x \ | |
31 | ldxr_##x %R1 %R0 %R1 \ | |
32 | beqi L##x##C##0 %R1 I##X##N \ | |
33 | calli @abort \ | |
34 | L##x##C##0: \ | |
35 | movi %R1 $off##x \ | |
36 | ldxr_##x %R0 %R0 %R1 \ | |
37 | beqi L##x##C##1 %R0 I##X##N \ | |
38 | calli @abort \ | |
39 | L##x##C##1: | |
40 | ||
41 | # define LDRL(C, N, R0, R1, R2) | |
42 | ||
43 | #endif | |
44 | ||
45 | #define UI(C, N, x, X, R0, R1) \ | |
46 | movi %R1 $offu##x \ | |
47 | ldxr_u##x %R1 %R0 %R1 \ | |
48 | beqi Lu##x##C##0 %R1 X##N \ | |
49 | calli @abort \ | |
50 | Lu##x##C##0: \ | |
51 | movi %R1 $offu##x \ | |
52 | ldxr_u##x %R0 %R0 %R1 \ | |
53 | beqi Lu##x##C##1 %R0 X##N \ | |
54 | calli @abort \ | |
55 | Lu##x##C##1: | |
56 | ||
57 | #define LDST1(X, N, R0, R1, R2) \ | |
58 | movi %R0 t0 \ | |
59 | movi %R1 C##N \ | |
60 | movi %R2 $offc \ | |
61 | stxr_c %R2 %R0 %R1 \ | |
62 | movi %R2 $offuc \ | |
63 | stxr_c %R2 %R0 %R1 \ | |
64 | movi %R1 S##N \ | |
65 | movi %R2 $offs \ | |
66 | stxr_s %R2 %R0 %R1 \ | |
67 | movi %R2 $offus \ | |
68 | stxr_s %R2 %R0 %R1 \ | |
69 | movi %R1 I##N \ | |
70 | movi %R2 $offi \ | |
71 | stxr_i %R2 %R0 %R1 \ | |
72 | LDSTL(N, R0, R1, R2) \ | |
73 | SI(X, N, c, C, R0, R1) \ | |
74 | movi %R0 t0 \ | |
75 | UI(X, N, c, C, R0, R1) \ | |
76 | movi %R0 t0 \ | |
77 | SI(X, N, s, S, R0, R1) \ | |
78 | movi %R0 t0 \ | |
79 | UI(X, N, s, S, R0, R1) \ | |
80 | movi %R0 t0 \ | |
81 | SI(X, N, i, I, R0, R1) \ | |
82 | movi %R0 t0 \ | |
83 | LDRL(X, N, R0, R1, R2) \ | |
84 | ||
85 | #define LDST0(R0, R1, R2) \ | |
86 | LDST1(0_##R0##_##R1##_##R2, 0, R0, R1, R2) \ | |
87 | LDST1(1_##R0##_##R1##_##R2, 1, R0, R1, R2) \ | |
88 | LDST1(2_##R0##_##R1##_##R2, 2, R0, R1, R2) \ | |
89 | LDST1(3_##R0##_##R1##_##R2, 3, R0, R1, R2) | |
90 | ||
91 | #define LDST(V0, V1, V2, R0, R1, R2) \ | |
92 | LDST0(V1, V2, V0) \ | |
93 | LDST0(V1, R0, V0) \ | |
94 | LDST0(V1, R1, V0) \ | |
95 | LDST0(V1, R2, V0) \ | |
96 | LDST0(V0, R0, V1) \ | |
97 | LDST0(V0, R1, V1) \ | |
98 | LDST0(V0, R2, V1) \ | |
99 | LDST0(V0, V2, V1) \ | |
100 | LDST0(V2, V0, V1) \ | |
101 | LDST0(V2, R0, V1) \ | |
102 | LDST0(V2, R1, V1) \ | |
103 | LDST0(V2, R2, V1) \ | |
104 | LDST0(R0, R1, V2) \ | |
105 | LDST0(R0, R2, V2) | |
106 | ||
107 | .code | |
108 | prolog | |
109 | ||
110 | /* Simple test to simplify validating encodings before | |
111 | * brute force tests */ | |
112 | movi %r0 t0 | |
113 | movi %r1 0x81 | |
114 | movi %r2 $offc | |
115 | stxr_c %r2 %r0 %r1 | |
116 | movi %r2 $offuc | |
117 | stxr_c %r2 %r0 %r1 | |
118 | movi %r1 0x8001 | |
119 | movi %r2 $offs | |
120 | stxr_s %r2 %r0 %r1 | |
121 | movi %r2 $offus | |
122 | stxr_s %r2 %r0 %r1 | |
123 | movi %r1 0x80000001 | |
124 | movi %r2 $offi | |
125 | stxr_i %r2 %r0 %r1 | |
126 | #if __WORDSIZE == 64 | |
127 | movi %r2 $offui | |
128 | stxr_i %r2 %r0 %r1 | |
129 | movi %r1 0x8000000000000001 | |
130 | movi %r2 $offl | |
131 | stxr_l %r2 %r0 %r1 | |
132 | #endif | |
133 | movi %r1 $offc | |
134 | ldxr_c %r1 %r0 %r1 | |
135 | beqi Lc0 %r1 XC | |
136 | calli @abort | |
137 | Lc0: | |
138 | movi %r1 $offc | |
139 | ldxr_c %r0 %r0 %r1 | |
140 | beqi Lc1 %r0 XC | |
141 | calli @abort | |
142 | Lc1: | |
143 | movi %r0 t0 | |
144 | movi %r1 $offuc | |
145 | ldxr_uc %r1 %r0 %r1 | |
146 | beqi Luc0 %r1 0x81 | |
147 | calli @abort | |
148 | Luc0: | |
149 | movi %r1 $offuc | |
150 | ldxr_uc %r0 %r0 %r1 | |
151 | beqi Luc1 %r0 0x81 | |
152 | calli @abort | |
153 | Luc1: | |
154 | movi %r0 t0 | |
155 | movi %r1 $offs | |
156 | ldxr_s %r1 %r0 %r1 | |
157 | beqi Ls0 %r1 XS | |
158 | calli @abort | |
159 | Ls0: | |
160 | movi %r1 $offs | |
161 | ldxr_s %r0 %r0 %r1 | |
162 | beqi Ls1 %r0 XS | |
163 | calli @abort | |
164 | Ls1: | |
165 | movi %r0 t0 | |
166 | movi %r1 $offus | |
167 | ldxr_us %r1 %r0 %r1 | |
168 | beqi Lus0 %r1 0x8001 | |
169 | calli @abort | |
170 | Lus0: | |
171 | movi %r1 $offus | |
172 | ldxr_us %r0 %r0 %r1 | |
173 | beqi Lus1 %r0 0x8001 | |
174 | calli @abort | |
175 | Lus1: | |
176 | movi %r0 t0 | |
177 | movi %r1 $offi | |
178 | ldxr_i %r1 %r0 %r1 | |
179 | beqi Li0 %r1 XI | |
180 | calli @abort | |
181 | Li0: | |
182 | movi %r1 $offi | |
183 | ldxr_i %r0 %r0 %r1 | |
184 | beqi Li1 %r0 XI | |
185 | calli @abort | |
186 | Li1: | |
187 | #if __WORDSIZE == 64 | |
188 | movi %r0 t0 | |
189 | movi %r1 $offui | |
190 | ldxr_ui %r1 %r0 %r1 | |
191 | beqi Lui0 %r1 0x80000001 | |
192 | calli @abort | |
193 | Lui0: | |
194 | movi %r1 $offui | |
195 | ldxr_ui %r0 %r0 %r1 | |
196 | beqi Lui1 %r0 0x80000001 | |
197 | calli @abort | |
198 | Lui1: | |
199 | movi %r0 t0 | |
200 | movi %r1 $offl | |
201 | ldxr_l %r1 %r0 %r1 | |
202 | beqi Ll0 %r1 0x8000000000000001 | |
203 | calli @abort | |
204 | Ll0: | |
205 | movi %r1 $offl | |
206 | ldxr_l %r0 %r0 %r1 | |
207 | beqi Ll1 %r0 0x8000000000000001 | |
208 | calli @abort | |
209 | Ll1: | |
210 | #endif | |
211 | ||
212 | LDST(v0, v1, v2, r0, r1, r2) | |
213 | // just to know did not abort | |
214 | prepare | |
215 | pushargi ok | |
216 | ellipsis | |
217 | finishi @printf | |
218 | ret | |
219 | epilog |