root / target-ppc / op_helper_mem.h @ 3a607854
History | View | Annotate | Download (9.3 kB)
1 | 76a66253 | j_mayer | /*
|
---|---|---|---|
2 | 76a66253 | j_mayer | * PowerPC emulation micro-operations helpers for qemu.
|
3 | d9bce9d9 | j_mayer | *
|
4 | 76a66253 | j_mayer | * Copyright (c) 2003-2007 Jocelyn Mayer
|
5 | 76a66253 | j_mayer | *
|
6 | 76a66253 | j_mayer | * This library is free software; you can redistribute it and/or
|
7 | 76a66253 | j_mayer | * modify it under the terms of the GNU Lesser General Public
|
8 | 76a66253 | j_mayer | * License as published by the Free Software Foundation; either
|
9 | 76a66253 | j_mayer | * version 2 of the License, or (at your option) any later version.
|
10 | 76a66253 | j_mayer | *
|
11 | 76a66253 | j_mayer | * This library is distributed in the hope that it will be useful,
|
12 | 76a66253 | j_mayer | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 76a66253 | j_mayer | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 76a66253 | j_mayer | * Lesser General Public License for more details.
|
15 | 76a66253 | j_mayer | *
|
16 | 76a66253 | j_mayer | * You should have received a copy of the GNU Lesser General Public
|
17 | 76a66253 | j_mayer | * License along with this library; if not, write to the Free Software
|
18 | 76a66253 | j_mayer | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19 | 76a66253 | j_mayer | */
|
20 | 76a66253 | j_mayer | |
21 | 76a66253 | j_mayer | /* Multiple word / string load and store */
|
22 | 76a66253 | j_mayer | static inline target_ulong glue(ld32r, MEMSUFFIX) (target_ulong EA) |
23 | 76a66253 | j_mayer | { |
24 | 76a66253 | j_mayer | uint32_t tmp = glue(ldl, MEMSUFFIX)(EA); |
25 | 76a66253 | j_mayer | return ((tmp & 0xFF000000UL) >> 24) | ((tmp & 0x00FF0000UL) >> 8) | |
26 | 76a66253 | j_mayer | ((tmp & 0x0000FF00UL) << 8) | ((tmp & 0x000000FFUL) << 24); |
27 | 76a66253 | j_mayer | } |
28 | 76a66253 | j_mayer | |
29 | 76a66253 | j_mayer | static inline void glue(st32r, MEMSUFFIX) (target_ulong EA, target_ulong data) |
30 | 76a66253 | j_mayer | { |
31 | 76a66253 | j_mayer | uint32_t tmp = |
32 | 76a66253 | j_mayer | ((data & 0xFF000000UL) >> 24) | ((data & 0x00FF0000UL) >> 8) | |
33 | 76a66253 | j_mayer | ((data & 0x0000FF00UL) << 8) | ((data & 0x000000FFUL) << 24); |
34 | 76a66253 | j_mayer | glue(stl, MEMSUFFIX)(EA, tmp); |
35 | 76a66253 | j_mayer | } |
36 | 76a66253 | j_mayer | |
37 | 76a66253 | j_mayer | void glue(do_lmw, MEMSUFFIX) (int dst) |
38 | 76a66253 | j_mayer | { |
39 | 76a66253 | j_mayer | for (; dst < 32; dst++, T0 += 4) { |
40 | d9bce9d9 | j_mayer | ugpr(dst) = glue(ldl, MEMSUFFIX)((uint32_t)T0); |
41 | d9bce9d9 | j_mayer | } |
42 | d9bce9d9 | j_mayer | } |
43 | d9bce9d9 | j_mayer | |
44 | d9bce9d9 | j_mayer | #if defined(TARGET_PPC64)
|
45 | d9bce9d9 | j_mayer | void glue(do_lmw_64, MEMSUFFIX) (int dst) |
46 | d9bce9d9 | j_mayer | { |
47 | d9bce9d9 | j_mayer | for (; dst < 32; dst++, T0 += 4) { |
48 | d9bce9d9 | j_mayer | ugpr(dst) = glue(ldl, MEMSUFFIX)((uint64_t)T0); |
49 | 76a66253 | j_mayer | } |
50 | 76a66253 | j_mayer | } |
51 | d9bce9d9 | j_mayer | #endif
|
52 | 76a66253 | j_mayer | |
53 | 76a66253 | j_mayer | void glue(do_stmw, MEMSUFFIX) (int src) |
54 | 76a66253 | j_mayer | { |
55 | 76a66253 | j_mayer | for (; src < 32; src++, T0 += 4) { |
56 | d9bce9d9 | j_mayer | glue(stl, MEMSUFFIX)((uint32_t)T0, ugpr(src)); |
57 | d9bce9d9 | j_mayer | } |
58 | d9bce9d9 | j_mayer | } |
59 | d9bce9d9 | j_mayer | |
60 | d9bce9d9 | j_mayer | #if defined(TARGET_PPC64)
|
61 | d9bce9d9 | j_mayer | void glue(do_stmw_64, MEMSUFFIX) (int src) |
62 | d9bce9d9 | j_mayer | { |
63 | d9bce9d9 | j_mayer | for (; src < 32; src++, T0 += 4) { |
64 | d9bce9d9 | j_mayer | glue(stl, MEMSUFFIX)((uint64_t)T0, ugpr(src)); |
65 | 76a66253 | j_mayer | } |
66 | 76a66253 | j_mayer | } |
67 | d9bce9d9 | j_mayer | #endif
|
68 | 76a66253 | j_mayer | |
69 | 76a66253 | j_mayer | void glue(do_lmw_le, MEMSUFFIX) (int dst) |
70 | 76a66253 | j_mayer | { |
71 | 76a66253 | j_mayer | for (; dst < 32; dst++, T0 += 4) { |
72 | d9bce9d9 | j_mayer | ugpr(dst) = glue(ld32r, MEMSUFFIX)((uint32_t)T0); |
73 | d9bce9d9 | j_mayer | } |
74 | d9bce9d9 | j_mayer | } |
75 | d9bce9d9 | j_mayer | |
76 | d9bce9d9 | j_mayer | #if defined(TARGET_PPC64)
|
77 | d9bce9d9 | j_mayer | void glue(do_lmw_le_64, MEMSUFFIX) (int dst) |
78 | d9bce9d9 | j_mayer | { |
79 | d9bce9d9 | j_mayer | for (; dst < 32; dst++, T0 += 4) { |
80 | d9bce9d9 | j_mayer | ugpr(dst) = glue(ld32r, MEMSUFFIX)((uint64_t)T0); |
81 | 76a66253 | j_mayer | } |
82 | 76a66253 | j_mayer | } |
83 | d9bce9d9 | j_mayer | #endif
|
84 | 76a66253 | j_mayer | |
85 | 76a66253 | j_mayer | void glue(do_stmw_le, MEMSUFFIX) (int src) |
86 | 76a66253 | j_mayer | { |
87 | 76a66253 | j_mayer | for (; src < 32; src++, T0 += 4) { |
88 | d9bce9d9 | j_mayer | glue(st32r, MEMSUFFIX)((uint32_t)T0, ugpr(src)); |
89 | 76a66253 | j_mayer | } |
90 | 76a66253 | j_mayer | } |
91 | 76a66253 | j_mayer | |
92 | d9bce9d9 | j_mayer | #if defined(TARGET_PPC64)
|
93 | d9bce9d9 | j_mayer | void glue(do_stmw_le_64, MEMSUFFIX) (int src) |
94 | d9bce9d9 | j_mayer | { |
95 | d9bce9d9 | j_mayer | for (; src < 32; src++, T0 += 4) { |
96 | d9bce9d9 | j_mayer | glue(st32r, MEMSUFFIX)((uint64_t)T0, ugpr(src)); |
97 | d9bce9d9 | j_mayer | } |
98 | d9bce9d9 | j_mayer | } |
99 | d9bce9d9 | j_mayer | #endif
|
100 | d9bce9d9 | j_mayer | |
101 | 9a64fbe4 | bellard | void glue(do_lsw, MEMSUFFIX) (int dst) |
102 | 9a64fbe4 | bellard | { |
103 | 9a64fbe4 | bellard | uint32_t tmp; |
104 | 9a64fbe4 | bellard | int sh;
|
105 | 9a64fbe4 | bellard | |
106 | 9a64fbe4 | bellard | for (; T1 > 3; T1 -= 4, T0 += 4) { |
107 | d9bce9d9 | j_mayer | ugpr(dst++) = glue(ldl, MEMSUFFIX)((uint32_t)T0); |
108 | 76a66253 | j_mayer | if (unlikely(dst == 32)) |
109 | 9a64fbe4 | bellard | dst = 0;
|
110 | 9a64fbe4 | bellard | } |
111 | 76a66253 | j_mayer | if (unlikely(T1 != 0)) { |
112 | 9a64fbe4 | bellard | tmp = 0;
|
113 | 9a64fbe4 | bellard | for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) { |
114 | d9bce9d9 | j_mayer | tmp |= glue(ldub, MEMSUFFIX)((uint32_t)T0) << sh; |
115 | 9a64fbe4 | bellard | } |
116 | 9a64fbe4 | bellard | ugpr(dst) = tmp; |
117 | 9a64fbe4 | bellard | } |
118 | 9a64fbe4 | bellard | } |
119 | 9a64fbe4 | bellard | |
120 | d9bce9d9 | j_mayer | #if defined(TARGET_PPC64)
|
121 | d9bce9d9 | j_mayer | void glue(do_lsw_64, MEMSUFFIX) (int dst) |
122 | d9bce9d9 | j_mayer | { |
123 | d9bce9d9 | j_mayer | uint32_t tmp; |
124 | d9bce9d9 | j_mayer | int sh;
|
125 | d9bce9d9 | j_mayer | |
126 | d9bce9d9 | j_mayer | for (; T1 > 3; T1 -= 4, T0 += 4) { |
127 | d9bce9d9 | j_mayer | ugpr(dst++) = glue(ldl, MEMSUFFIX)((uint64_t)T0); |
128 | d9bce9d9 | j_mayer | if (unlikely(dst == 32)) |
129 | d9bce9d9 | j_mayer | dst = 0;
|
130 | d9bce9d9 | j_mayer | } |
131 | d9bce9d9 | j_mayer | if (unlikely(T1 != 0)) { |
132 | d9bce9d9 | j_mayer | tmp = 0;
|
133 | d9bce9d9 | j_mayer | for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) { |
134 | d9bce9d9 | j_mayer | tmp |= glue(ldub, MEMSUFFIX)((uint64_t)T0) << sh; |
135 | d9bce9d9 | j_mayer | } |
136 | d9bce9d9 | j_mayer | ugpr(dst) = tmp; |
137 | d9bce9d9 | j_mayer | } |
138 | d9bce9d9 | j_mayer | } |
139 | d9bce9d9 | j_mayer | #endif
|
140 | d9bce9d9 | j_mayer | |
141 | 9a64fbe4 | bellard | void glue(do_stsw, MEMSUFFIX) (int src) |
142 | 9a64fbe4 | bellard | { |
143 | 9a64fbe4 | bellard | int sh;
|
144 | 9a64fbe4 | bellard | |
145 | 9a64fbe4 | bellard | for (; T1 > 3; T1 -= 4, T0 += 4) { |
146 | d9bce9d9 | j_mayer | glue(stl, MEMSUFFIX)((uint32_t)T0, ugpr(src++)); |
147 | 76a66253 | j_mayer | if (unlikely(src == 32)) |
148 | 9a64fbe4 | bellard | src = 0;
|
149 | 9a64fbe4 | bellard | } |
150 | 76a66253 | j_mayer | if (unlikely(T1 != 0)) { |
151 | 9a64fbe4 | bellard | for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) |
152 | d9bce9d9 | j_mayer | glue(stb, MEMSUFFIX)((uint32_t)T0, (ugpr(src) >> sh) & 0xFF);
|
153 | 9a64fbe4 | bellard | } |
154 | 9a64fbe4 | bellard | } |
155 | 9a64fbe4 | bellard | |
156 | d9bce9d9 | j_mayer | #if defined(TARGET_PPC64)
|
157 | d9bce9d9 | j_mayer | void glue(do_stsw_64, MEMSUFFIX) (int src) |
158 | d9bce9d9 | j_mayer | { |
159 | d9bce9d9 | j_mayer | int sh;
|
160 | d9bce9d9 | j_mayer | |
161 | d9bce9d9 | j_mayer | for (; T1 > 3; T1 -= 4, T0 += 4) { |
162 | d9bce9d9 | j_mayer | glue(stl, MEMSUFFIX)((uint64_t)T0, ugpr(src++)); |
163 | d9bce9d9 | j_mayer | if (unlikely(src == 32)) |
164 | d9bce9d9 | j_mayer | src = 0;
|
165 | d9bce9d9 | j_mayer | } |
166 | d9bce9d9 | j_mayer | if (unlikely(T1 != 0)) { |
167 | d9bce9d9 | j_mayer | for (sh = 24; T1 > 0; T1--, T0++, sh -= 8) |
168 | d9bce9d9 | j_mayer | glue(stb, MEMSUFFIX)((uint64_t)T0, (ugpr(src) >> sh) & 0xFF);
|
169 | d9bce9d9 | j_mayer | } |
170 | d9bce9d9 | j_mayer | } |
171 | d9bce9d9 | j_mayer | #endif
|
172 | d9bce9d9 | j_mayer | |
173 | 111bfab3 | bellard | void glue(do_lsw_le, MEMSUFFIX) (int dst) |
174 | 111bfab3 | bellard | { |
175 | 111bfab3 | bellard | uint32_t tmp; |
176 | 111bfab3 | bellard | int sh;
|
177 | 111bfab3 | bellard | |
178 | 111bfab3 | bellard | for (; T1 > 3; T1 -= 4, T0 += 4) { |
179 | d9bce9d9 | j_mayer | ugpr(dst++) = glue(ld32r, MEMSUFFIX)((uint32_t)T0); |
180 | d9bce9d9 | j_mayer | if (unlikely(dst == 32)) |
181 | d9bce9d9 | j_mayer | dst = 0;
|
182 | d9bce9d9 | j_mayer | } |
183 | d9bce9d9 | j_mayer | if (unlikely(T1 != 0)) { |
184 | d9bce9d9 | j_mayer | tmp = 0;
|
185 | d9bce9d9 | j_mayer | for (sh = 0; T1 > 0; T1--, T0++, sh += 8) { |
186 | d9bce9d9 | j_mayer | tmp |= glue(ldub, MEMSUFFIX)((uint32_t)T0) << sh; |
187 | d9bce9d9 | j_mayer | } |
188 | d9bce9d9 | j_mayer | ugpr(dst) = tmp; |
189 | d9bce9d9 | j_mayer | } |
190 | d9bce9d9 | j_mayer | } |
191 | d9bce9d9 | j_mayer | |
192 | d9bce9d9 | j_mayer | #if defined(TARGET_PPC64)
|
193 | d9bce9d9 | j_mayer | void glue(do_lsw_le_64, MEMSUFFIX) (int dst) |
194 | d9bce9d9 | j_mayer | { |
195 | d9bce9d9 | j_mayer | uint32_t tmp; |
196 | d9bce9d9 | j_mayer | int sh;
|
197 | d9bce9d9 | j_mayer | |
198 | d9bce9d9 | j_mayer | for (; T1 > 3; T1 -= 4, T0 += 4) { |
199 | d9bce9d9 | j_mayer | ugpr(dst++) = glue(ld32r, MEMSUFFIX)((uint64_t)T0); |
200 | 76a66253 | j_mayer | if (unlikely(dst == 32)) |
201 | 111bfab3 | bellard | dst = 0;
|
202 | 111bfab3 | bellard | } |
203 | 76a66253 | j_mayer | if (unlikely(T1 != 0)) { |
204 | 111bfab3 | bellard | tmp = 0;
|
205 | 111bfab3 | bellard | for (sh = 0; T1 > 0; T1--, T0++, sh += 8) { |
206 | d9bce9d9 | j_mayer | tmp |= glue(ldub, MEMSUFFIX)((uint64_t)T0) << sh; |
207 | 111bfab3 | bellard | } |
208 | 111bfab3 | bellard | ugpr(dst) = tmp; |
209 | 111bfab3 | bellard | } |
210 | 111bfab3 | bellard | } |
211 | d9bce9d9 | j_mayer | #endif
|
212 | 111bfab3 | bellard | |
213 | 111bfab3 | bellard | void glue(do_stsw_le, MEMSUFFIX) (int src) |
214 | 111bfab3 | bellard | { |
215 | 111bfab3 | bellard | int sh;
|
216 | 111bfab3 | bellard | |
217 | 111bfab3 | bellard | for (; T1 > 3; T1 -= 4, T0 += 4) { |
218 | d9bce9d9 | j_mayer | glue(st32r, MEMSUFFIX)((uint32_t)T0, ugpr(src++)); |
219 | d9bce9d9 | j_mayer | if (unlikely(src == 32)) |
220 | d9bce9d9 | j_mayer | src = 0;
|
221 | d9bce9d9 | j_mayer | } |
222 | d9bce9d9 | j_mayer | if (unlikely(T1 != 0)) { |
223 | d9bce9d9 | j_mayer | for (sh = 0; T1 > 0; T1--, T0++, sh += 8) |
224 | d9bce9d9 | j_mayer | glue(stb, MEMSUFFIX)((uint32_t)T0, (ugpr(src) >> sh) & 0xFF);
|
225 | d9bce9d9 | j_mayer | } |
226 | d9bce9d9 | j_mayer | } |
227 | d9bce9d9 | j_mayer | |
228 | d9bce9d9 | j_mayer | #if defined(TARGET_PPC64)
|
229 | d9bce9d9 | j_mayer | void glue(do_stsw_le_64, MEMSUFFIX) (int src) |
230 | d9bce9d9 | j_mayer | { |
231 | d9bce9d9 | j_mayer | int sh;
|
232 | d9bce9d9 | j_mayer | |
233 | d9bce9d9 | j_mayer | for (; T1 > 3; T1 -= 4, T0 += 4) { |
234 | d9bce9d9 | j_mayer | glue(st32r, MEMSUFFIX)((uint64_t)T0, ugpr(src++)); |
235 | 76a66253 | j_mayer | if (unlikely(src == 32)) |
236 | 111bfab3 | bellard | src = 0;
|
237 | 111bfab3 | bellard | } |
238 | 76a66253 | j_mayer | if (unlikely(T1 != 0)) { |
239 | 111bfab3 | bellard | for (sh = 0; T1 > 0; T1--, T0++, sh += 8) |
240 | d9bce9d9 | j_mayer | glue(stb, MEMSUFFIX)((uint64_t)T0, (ugpr(src) >> sh) & 0xFF);
|
241 | 111bfab3 | bellard | } |
242 | 111bfab3 | bellard | } |
243 | d9bce9d9 | j_mayer | #endif
|
244 | 111bfab3 | bellard | |
245 | 36f69651 | j_mayer | /* Instruction cache invalidation helper */
|
246 | 36f69651 | j_mayer | void glue(do_icbi, MEMSUFFIX) (void) |
247 | 36f69651 | j_mayer | { |
248 | 36f69651 | j_mayer | uint32_t tmp; |
249 | 36f69651 | j_mayer | /* Invalidate one cache line :
|
250 | 36f69651 | j_mayer | * PowerPC specification says this is to be treated like a load
|
251 | 36f69651 | j_mayer | * (not a fetch) by the MMU. To be sure it will be so,
|
252 | 36f69651 | j_mayer | * do the load "by hand".
|
253 | 36f69651 | j_mayer | */
|
254 | 36f69651 | j_mayer | tmp = glue(ldl, MEMSUFFIX)((uint32_t)T0); |
255 | 36f69651 | j_mayer | T0 &= ~(ICACHE_LINE_SIZE - 1);
|
256 | 36f69651 | j_mayer | tb_invalidate_page_range((uint32_t)T0, (uint32_t)(T0 + ICACHE_LINE_SIZE)); |
257 | 36f69651 | j_mayer | } |
258 | 36f69651 | j_mayer | |
259 | 36f69651 | j_mayer | #if defined(TARGET_PPC64)
|
260 | 36f69651 | j_mayer | void glue(do_icbi_64, MEMSUFFIX) (void) |
261 | 36f69651 | j_mayer | { |
262 | 36f69651 | j_mayer | uint64_t tmp; |
263 | 36f69651 | j_mayer | /* Invalidate one cache line :
|
264 | 36f69651 | j_mayer | * PowerPC specification says this is to be treated like a load
|
265 | 36f69651 | j_mayer | * (not a fetch) by the MMU. To be sure it will be so,
|
266 | 36f69651 | j_mayer | * do the load "by hand".
|
267 | 36f69651 | j_mayer | */
|
268 | 36f69651 | j_mayer | tmp = glue(ldq, MEMSUFFIX)((uint64_t)T0); |
269 | 36f69651 | j_mayer | T0 &= ~(ICACHE_LINE_SIZE - 1);
|
270 | 36f69651 | j_mayer | tb_invalidate_page_range((uint64_t)T0, (uint64_t)(T0 + ICACHE_LINE_SIZE)); |
271 | 36f69651 | j_mayer | } |
272 | 36f69651 | j_mayer | #endif
|
273 | 36f69651 | j_mayer | |
274 | 76a66253 | j_mayer | /* PPC 601 specific instructions (POWER bridge) */
|
275 | 76a66253 | j_mayer | // XXX: to be tested
|
276 | 76a66253 | j_mayer | void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb) |
277 | 76a66253 | j_mayer | { |
278 | 76a66253 | j_mayer | int i, c, d, reg;
|
279 | 76a66253 | j_mayer | |
280 | 76a66253 | j_mayer | d = 24;
|
281 | 76a66253 | j_mayer | reg = dest; |
282 | 76a66253 | j_mayer | for (i = 0; i < T1; i++) { |
283 | d9bce9d9 | j_mayer | c = glue(ldub, MEMSUFFIX)((uint32_t)T0++); |
284 | 76a66253 | j_mayer | /* ra (if not 0) and rb are never modified */
|
285 | 76a66253 | j_mayer | if (likely(reg != rb && (ra == 0 || reg != ra))) { |
286 | 76a66253 | j_mayer | ugpr(reg) = (ugpr(reg) & ~(0xFF << d)) | (c << d);
|
287 | 76a66253 | j_mayer | } |
288 | 76a66253 | j_mayer | if (unlikely(c == T2))
|
289 | 76a66253 | j_mayer | break;
|
290 | 76a66253 | j_mayer | if (likely(d != 0)) { |
291 | 76a66253 | j_mayer | d -= 8;
|
292 | 76a66253 | j_mayer | } else {
|
293 | 76a66253 | j_mayer | d = 24;
|
294 | 76a66253 | j_mayer | reg++; |
295 | 76a66253 | j_mayer | reg = reg & 0x1F;
|
296 | 76a66253 | j_mayer | } |
297 | 76a66253 | j_mayer | } |
298 | 76a66253 | j_mayer | T0 = i; |
299 | 76a66253 | j_mayer | } |
300 | 76a66253 | j_mayer | |
301 | 76a66253 | j_mayer | /* XXX: TAGs are not managed */
|
302 | 76a66253 | j_mayer | void glue(do_POWER2_lfq, MEMSUFFIX) (void) |
303 | 76a66253 | j_mayer | { |
304 | d9bce9d9 | j_mayer | FT0 = glue(ldfq, MEMSUFFIX)((uint32_t)T0); |
305 | d9bce9d9 | j_mayer | FT1 = glue(ldfq, MEMSUFFIX)((uint32_t)(T0 + 4));
|
306 | 76a66253 | j_mayer | } |
307 | 76a66253 | j_mayer | |
308 | 76a66253 | j_mayer | static inline double glue(ldfqr, MEMSUFFIX) (target_ulong EA) |
309 | 76a66253 | j_mayer | { |
310 | 76a66253 | j_mayer | union {
|
311 | 76a66253 | j_mayer | double d;
|
312 | 76a66253 | j_mayer | uint64_t u; |
313 | 76a66253 | j_mayer | } u; |
314 | 76a66253 | j_mayer | |
315 | 76a66253 | j_mayer | u.d = glue(ldfq, MEMSUFFIX)(EA); |
316 | 76a66253 | j_mayer | u.u = ((u.u & 0xFF00000000000000ULL) >> 56) | |
317 | 76a66253 | j_mayer | ((u.u & 0x00FF000000000000ULL) >> 40) | |
318 | 76a66253 | j_mayer | ((u.u & 0x0000FF0000000000ULL) >> 24) | |
319 | 76a66253 | j_mayer | ((u.u & 0x000000FF00000000ULL) >> 8) | |
320 | 76a66253 | j_mayer | ((u.u & 0x00000000FF000000ULL) << 8) | |
321 | 76a66253 | j_mayer | ((u.u & 0x0000000000FF0000ULL) << 24) | |
322 | 76a66253 | j_mayer | ((u.u & 0x000000000000FF00ULL) << 40) | |
323 | 76a66253 | j_mayer | ((u.u & 0x00000000000000FFULL) << 56); |
324 | 76a66253 | j_mayer | |
325 | 76a66253 | j_mayer | return u.d;
|
326 | 76a66253 | j_mayer | } |
327 | 76a66253 | j_mayer | |
328 | 76a66253 | j_mayer | void glue(do_POWER2_lfq_le, MEMSUFFIX) (void) |
329 | 76a66253 | j_mayer | { |
330 | d9bce9d9 | j_mayer | FT0 = glue(ldfqr, MEMSUFFIX)((uint32_t)(T0 + 4));
|
331 | d9bce9d9 | j_mayer | FT1 = glue(ldfqr, MEMSUFFIX)((uint32_t)T0); |
332 | 76a66253 | j_mayer | } |
333 | 76a66253 | j_mayer | |
334 | 76a66253 | j_mayer | void glue(do_POWER2_stfq, MEMSUFFIX) (void) |
335 | 76a66253 | j_mayer | { |
336 | d9bce9d9 | j_mayer | glue(stfq, MEMSUFFIX)((uint32_t)T0, FT0); |
337 | d9bce9d9 | j_mayer | glue(stfq, MEMSUFFIX)((uint32_t)(T0 + 4), FT1);
|
338 | 76a66253 | j_mayer | } |
339 | 76a66253 | j_mayer | |
340 | 76a66253 | j_mayer | static inline void glue(stfqr, MEMSUFFIX) (target_ulong EA, double d) |
341 | 76a66253 | j_mayer | { |
342 | 76a66253 | j_mayer | union {
|
343 | 76a66253 | j_mayer | double d;
|
344 | 76a66253 | j_mayer | uint64_t u; |
345 | 76a66253 | j_mayer | } u; |
346 | 76a66253 | j_mayer | |
347 | 76a66253 | j_mayer | u.d = d; |
348 | 76a66253 | j_mayer | u.u = ((u.u & 0xFF00000000000000ULL) >> 56) | |
349 | 76a66253 | j_mayer | ((u.u & 0x00FF000000000000ULL) >> 40) | |
350 | 76a66253 | j_mayer | ((u.u & 0x0000FF0000000000ULL) >> 24) | |
351 | 76a66253 | j_mayer | ((u.u & 0x000000FF00000000ULL) >> 8) | |
352 | 76a66253 | j_mayer | ((u.u & 0x00000000FF000000ULL) << 8) | |
353 | 76a66253 | j_mayer | ((u.u & 0x0000000000FF0000ULL) << 24) | |
354 | 76a66253 | j_mayer | ((u.u & 0x000000000000FF00ULL) << 40) | |
355 | 76a66253 | j_mayer | ((u.u & 0x00000000000000FFULL) << 56); |
356 | 76a66253 | j_mayer | glue(stfq, MEMSUFFIX)(EA, u.d); |
357 | 76a66253 | j_mayer | } |
358 | 76a66253 | j_mayer | |
359 | 76a66253 | j_mayer | void glue(do_POWER2_stfq_le, MEMSUFFIX) (void) |
360 | 76a66253 | j_mayer | { |
361 | d9bce9d9 | j_mayer | glue(stfqr, MEMSUFFIX)((uint32_t)(T0 + 4), FT0);
|
362 | d9bce9d9 | j_mayer | glue(stfqr, MEMSUFFIX)((uint32_t)T0, FT1); |
363 | 76a66253 | j_mayer | } |
364 | 76a66253 | j_mayer | |
365 | 9a64fbe4 | bellard | #undef MEMSUFFIX |