/[gxemul]/upstream/0.3.5/src/cpu_alpha_instr_alu.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.3.5/src/cpu_alpha_instr_alu.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (show annotations)
Mon Oct 8 16:18:43 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 6140 byte(s)
0.3.5
1 /*
2 * Copyright (C) 2005 Anders Gavare. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *
28 * $Id: cpu_alpha_instr_alu.c,v 1.12 2005/08/07 08:57:54 debug Exp $
29 *
30 * Alpha ALU instructions. (Included from tmp_alpha_misc.c.)
31 *
32 *
33 * Most ALU instructions have the following arguments:
34 *
35 * arg[0] = pointer to destination uint64_t
36 * arg[1] = pointer to source uint64_t nr 1
37 * arg[2] = pointer to source uint64_t nr 2
38 *
39 * or, if ALU_IMM is set, arg[2] contains an 8-bit immediate value.
40 *
41 * The main function groups are:
42 *
43 * ALU_INS inserts
44 * ALU_EXT extracts
45 * ALU_MSK masks
46 * ALU_CMOV conditional moves
47 * ALU_CMP compares
48 * none of the above everything else (add, sub, ...)
49 */
50
51 void ALU_N(struct cpu *cpu, struct alpha_instr_call *ic)
52 {
53 #ifdef ALU_INS
54
55 uint64_t x = *((uint64_t *)ic->arg[1]);
56 int r = (
57 #ifdef ALU_IMM
58 ic->arg[2]
59 #else
60 (*((uint64_t *)ic->arg[2]))
61 #endif
62 & 7) * 8;
63
64 #ifdef ALU_B
65 x &= 0xff;
66 #endif
67 #ifdef ALU_W
68 x &= 0xffff;
69 #endif
70 #ifdef ALU_L
71 x &= 0xffffffffULL;
72 #endif
73
74 #ifdef ALU_LO
75 x <<= r;
76 #else
77 r = 64 - r;
78 if (r == 64)
79 x = 0;
80 else
81 x >>= r;
82 #endif
83 *((uint64_t *)ic->arg[0]) = x;
84
85 #else /* ! INS */
86
87 #ifdef ALU_EXT
88
89 uint64_t x = *((uint64_t *)ic->arg[1]);
90 int r = (
91 #ifdef ALU_IMM
92 ic->arg[2]
93 #else
94 (*((uint64_t *)ic->arg[2]))
95 #endif
96 & 7) * 8;
97 #ifdef ALU_LO
98 x >>= r;
99 #else
100 r = 64 - r;
101 if (r != 64)
102 x <<= r;
103 #endif
104 #ifdef ALU_B
105 x &= 0xff;
106 #endif
107 #ifdef ALU_W
108 x &= 0xffff;
109 #endif
110 #ifdef ALU_L
111 x &= 0xffffffffULL;
112 #endif
113 *((uint64_t *)ic->arg[0]) = x;
114
115 #else /* ! EXT */
116
117 #ifdef ALU_MSK
118
119 uint64_t x = *((uint64_t *)ic->arg[1]);
120 #ifdef ALU_B
121 uint64_t mask = 0x00000000000000ffULL;
122 #endif
123 #ifdef ALU_W
124 uint64_t mask = 0x000000000000ffffULL;
125 #endif
126 #ifdef ALU_L
127 uint64_t mask = 0x00000000ffffffffULL;
128 #endif
129 #ifdef ALU_Q
130 uint64_t mask = 0xffffffffffffffffULL;
131 #endif
132 int r = (
133 #ifdef ALU_IMM
134 ic->arg[2]
135 #else
136 (*((uint64_t *)ic->arg[2]))
137 #endif
138 & 7) * 8;
139
140 #ifdef ALU_LO
141 mask <<= r;
142 #else
143 if (r == 0)
144 mask = 0;
145 else
146 mask >>= (64 - r);
147 #endif
148
149 *((uint64_t *)ic->arg[0]) = x & ~mask;
150
151 #else /* !MSK */
152
153 #ifdef ALU_CMOV
154
155 if (
156 #ifdef ALU_CMOV_lbc
157 !(
158 #endif
159 (*((int64_t *)ic->arg[1]))
160 #ifdef ALU_CMOV_eq
161 == 0
162 #endif
163 #ifdef ALU_CMOV_ne
164 != 0
165 #endif
166 #ifdef ALU_CMOV_le
167 <= 0
168 #endif
169 #ifdef ALU_CMOV_lt
170 < 0
171 #endif
172 #ifdef ALU_CMOV_ge
173 >= 0
174 #endif
175 #ifdef ALU_CMOV_gt
176 > 0
177 #endif
178 #ifdef ALU_CMOV_lbs
179 & 1
180 #endif
181 #ifdef ALU_CMOV_lbc
182 & 1)
183 #endif
184 )
185 *((uint64_t *)ic->arg[0]) =
186 #ifdef ALU_IMM
187 (uint64_t)ic->arg[2]
188 #else
189 (*((uint64_t *)ic->arg[2]))
190 #endif
191 ;
192
193 #else /* ! CMOV */
194
195 #ifdef ALU_CMP
196
197 uint64_t x;
198
199 x = (*((
200 #ifdef ALU_UNSIGNED
201 uint64_t
202 #else
203 int64_t
204 #endif
205 *)ic->arg[1]))
206
207 #ifdef ALU_CMP_EQ
208 ==
209 #endif
210 #ifdef ALU_CMP_LE
211 <=
212 #endif
213 #ifdef ALU_CMP_LT
214 <
215 #endif
216
217 #ifdef ALU_IMM
218 #ifdef ALU_UNSIGNED
219 (uint64_t)ic->arg[2]
220 #else
221 (int64_t)ic->arg[2]
222 #endif
223 #else
224 #ifdef ALU_UNSIGNED
225 (*((uint64_t *)ic->arg[2]))
226 #else
227 (*((int64_t *)ic->arg[2]))
228 #endif
229 #endif
230 ;
231
232 #else /* !ALU_CMP */
233
234 #ifdef ALU_LONG
235 /* Long */
236 int32_t x;
237 #else
238 /* Quad */
239 int64_t x;
240 #endif
241
242 #ifdef ALU_ZAP
243 /* Prepare for zapping: */
244 uint64_t zapmask = 0xffffffffffffffffULL;
245 int zapbytes =
246 #ifdef ALU_NOT
247 ~
248 #endif
249 #ifdef ALU_IMM
250 (int64_t)ic->arg[2]
251 #else
252 (*((uint64_t *)ic->arg[2]))
253 #endif
254 ;
255 if (zapbytes & 0x80)
256 zapmask &= ~0xff00000000000000ULL;
257 if (zapbytes & 0x40)
258 zapmask &= ~0xff000000000000ULL;
259 if (zapbytes & 0x20)
260 zapmask &= ~0xff0000000000ULL;
261 if (zapbytes & 0x10)
262 zapmask &= ~0xff00000000ULL;
263 if (zapbytes & 0x08)
264 zapmask &= ~0xff000000ULL;
265 if (zapbytes & 0x04)
266 zapmask &= ~0xff0000ULL;
267 if (zapbytes & 0x02)
268 zapmask &= ~0xff00ULL;
269 if (zapbytes & 0x01)
270 zapmask &= ~0xffULL;
271 #endif /* ZAP */
272
273 x = (
274 #ifdef ALU_SRA
275 (int64_t)
276 #endif
277 (*((uint64_t *)ic->arg[1]))
278 #ifdef ALU_S4
279 * 4
280 #endif
281 #ifdef ALU_S8
282 * 8
283 #endif
284 )
285 #ifdef ALU_ADD
286 +
287 #endif
288 #ifdef ALU_SUB
289 -
290 #endif
291 #ifdef ALU_OR
292 |
293 #endif
294 #ifdef ALU_XOR
295 ^
296 #endif
297 #ifdef ALU_AND
298 &
299 #endif
300 #ifdef ALU_SLL
301 <<
302 #endif
303 #if defined(ALU_SRA) || defined(ALU_SRL)
304 >>
305 #endif
306
307 #ifdef ALU_ZAP
308 & zapmask
309 #else /* !ZAP */
310 (
311 #ifdef ALU_NOT
312 ~
313 #endif
314 (
315 #ifdef ALU_IMM
316 (int64_t)ic->arg[2]
317 #else
318 (*((uint64_t *)ic->arg[2]))
319 #endif
320 #if defined(ALU_SRA) || defined(ALU_SRL) || defined(ALU_SLL)
321 & 63
322 #endif
323 )
324 )
325 #endif /* !ZAP */
326
327 ;
328
329 #endif /* !ALU_CMP */
330
331 *((uint64_t *)ic->arg[0]) = x;
332 #endif /* ! CMOV */
333 #endif /* ! MSK */
334 #endif /* ! EXT */
335 #endif /* ! INS */
336 }
337

  ViewVC Help
Powered by ViewVC 1.1.26