Revision 69d6275b target-sh4/op_helper.c
b/target-sh4/op_helper.c | ||
---|---|---|
163 | 163 |
#define SETM env->sr |= SR_M |
164 | 164 |
#define CLRM env->sr &= ~SR_M |
165 | 165 |
|
166 |
void helper_div1_T0_T1(void)
|
|
166 |
uint32_t helper_div1(uint32_t arg0, uint32_t arg1)
|
|
167 | 167 |
{ |
168 | 168 |
uint32_t tmp0, tmp2; |
169 | 169 |
uint8_t old_q, tmp1 = 0xff; |
170 | 170 |
|
171 |
//printf("div1 T0=0x%08x T1=0x%08x M=%d Q=%d T=%d\n", T0, T1, M, Q, T);
|
|
171 |
//printf("div1 arg0=0x%08x arg1=0x%08x M=%d Q=%d T=%d\n", arg0, arg1, M, Q, T);
|
|
172 | 172 |
old_q = Q; |
173 |
if ((0x80000000 & T1) != 0)
|
|
173 |
if ((0x80000000 & arg1) != 0)
|
|
174 | 174 |
SETQ; |
175 | 175 |
else |
176 | 176 |
CLRQ; |
177 |
tmp2 = T0;
|
|
178 |
T1 <<= 1;
|
|
179 |
T1 |= T;
|
|
177 |
tmp2 = arg0;
|
|
178 |
arg1 <<= 1;
|
|
179 |
arg1 |= T;
|
|
180 | 180 |
switch (old_q) { |
181 | 181 |
case 0: |
182 | 182 |
switch (M) { |
183 | 183 |
case 0: |
184 |
tmp0 = T1;
|
|
185 |
T1 -= tmp2;
|
|
186 |
tmp1 = T1 > tmp0;
|
|
184 |
tmp0 = arg1;
|
|
185 |
arg1 -= tmp2;
|
|
186 |
tmp1 = arg1 > tmp0;
|
|
187 | 187 |
switch (Q) { |
188 | 188 |
case 0: |
189 | 189 |
if (tmp1) |
... | ... | |
200 | 200 |
} |
201 | 201 |
break; |
202 | 202 |
case 1: |
203 |
tmp0 = T1;
|
|
204 |
T1 += tmp2;
|
|
205 |
tmp1 = T1 < tmp0;
|
|
203 |
tmp0 = arg1;
|
|
204 |
arg1 += tmp2;
|
|
205 |
tmp1 = arg1 < tmp0;
|
|
206 | 206 |
switch (Q) { |
207 | 207 |
case 0: |
208 | 208 |
if (tmp1 == 0) |
... | ... | |
223 | 223 |
case 1: |
224 | 224 |
switch (M) { |
225 | 225 |
case 0: |
226 |
tmp0 = T1;
|
|
227 |
T1 += tmp2;
|
|
228 |
tmp1 = T1 < tmp0;
|
|
226 |
tmp0 = arg1;
|
|
227 |
arg1 += tmp2;
|
|
228 |
tmp1 = arg1 < tmp0;
|
|
229 | 229 |
switch (Q) { |
230 | 230 |
case 0: |
231 | 231 |
if (tmp1) |
... | ... | |
242 | 242 |
} |
243 | 243 |
break; |
244 | 244 |
case 1: |
245 |
tmp0 = T1;
|
|
246 |
T1 -= tmp2;
|
|
247 |
tmp1 = T1 > tmp0;
|
|
245 |
tmp0 = arg1;
|
|
246 |
arg1 -= tmp2;
|
|
247 |
tmp1 = arg1 > tmp0;
|
|
248 | 248 |
switch (Q) { |
249 | 249 |
case 0: |
250 | 250 |
if (tmp1 == 0) |
... | ... | |
267 | 267 |
SETT; |
268 | 268 |
else |
269 | 269 |
CLRT; |
270 |
//printf("Output: T1=0x%08x M=%d Q=%d T=%d\n", T1, M, Q, T); |
|
270 |
//printf("Output: arg1=0x%08x M=%d Q=%d T=%d\n", arg1, M, Q, T); |
|
271 |
return arg1; |
|
271 | 272 |
} |
272 | 273 |
|
273 | 274 |
void helper_macl(uint32_t arg0, uint32_t arg1) |
... | ... | |
365 | 366 |
return arg1; |
366 | 367 |
} |
367 | 368 |
|
368 |
void helper_rotcl(uint32_t * addr) |
|
369 |
{ |
|
370 |
uint32_t new; |
|
371 |
|
|
372 |
new = (*addr << 1) | (env->sr & SR_T); |
|
373 |
if (*addr & 0x80000000) |
|
374 |
env->sr |= SR_T; |
|
375 |
else |
|
376 |
env->sr &= ~SR_T; |
|
377 |
*addr = new; |
|
378 |
} |
|
379 |
|
|
380 |
void helper_rotcr(uint32_t * addr) |
|
381 |
{ |
|
382 |
uint32_t new; |
|
383 |
|
|
384 |
new = (*addr >> 1) | ((env->sr & SR_T) ? 0x80000000 : 0); |
|
385 |
if (*addr & 1) |
|
386 |
env->sr |= SR_T; |
|
387 |
else |
|
388 |
env->sr &= ~SR_T; |
|
389 |
*addr = new; |
|
390 |
} |
|
391 |
|
|
392 | 369 |
void helper_ld_fpscr(uint32_t val) |
393 | 370 |
{ |
394 | 371 |
env->fpscr = val & 0x003fffff; |
Also available in: Unified diff