Revision d57c4e01 ops_template.h
b/ops_template.h | ||
---|---|---|
175 | 175 |
static int glue(compute_all_shl, SUFFIX)(void) |
176 | 176 |
{ |
177 | 177 |
int cf, pf, af, zf, sf, of; |
178 |
cf = CC_SRC & 1;
|
|
178 |
cf = (CC_SRC >> (DATA_BITS - 1)) & CC_C;
|
|
179 | 179 |
pf = parity_table[(uint8_t)CC_DST]; |
180 | 180 |
af = 0; /* undefined */ |
181 | 181 |
zf = ((DATA_TYPE)CC_DST == 0) << 6; |
182 | 182 |
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80; |
183 |
of = lshift(CC_SRC, 12 - DATA_BITS) & CC_O; /* only meaniful for shr with count == 1 */ |
|
183 |
/* of is defined if shift count == 1 */ |
|
184 |
of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O; |
|
184 | 185 |
return cf | pf | af | zf | sf | of; |
185 | 186 |
} |
186 | 187 |
|
... | ... | |
199 | 200 |
af = 0; /* undefined */ |
200 | 201 |
zf = ((DATA_TYPE)CC_DST == 0) << 6; |
201 | 202 |
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80; |
202 |
of = 0; /* only meaniful for shr with count == 1 */ |
|
203 |
/* of is defined if shift count == 1 */ |
|
204 |
of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O; |
|
203 | 205 |
return cf | pf | af | zf | sf | of; |
204 | 206 |
} |
205 | 207 |
|
... | ... | |
415 | 417 |
{ |
416 | 418 |
int count; |
417 | 419 |
count = T1 & 0x1f; |
418 |
if (count == 1) { |
|
419 |
CC_SRC = T0; |
|
420 |
T0 = T0 << 1; |
|
421 |
CC_DST = T0; |
|
422 |
CC_OP = CC_OP_ADDB + SHIFT; |
|
423 |
} else if (count) { |
|
424 |
CC_SRC = (DATA_TYPE)T0 >> (DATA_BITS - count); |
|
420 |
if (count) { |
|
421 |
CC_SRC = (DATA_TYPE)T0 << (count - 1); |
|
425 | 422 |
T0 = T0 << count; |
426 | 423 |
CC_DST = T0; |
427 | 424 |
CC_OP = CC_OP_SHLB + SHIFT; |
... | ... | |
438 | 435 |
CC_SRC = T0 >> (count - 1); |
439 | 436 |
T0 = T0 >> count; |
440 | 437 |
CC_DST = T0; |
441 |
CC_OP = CC_OP_SHLB + SHIFT;
|
|
438 |
CC_OP = CC_OP_SARB + SHIFT;
|
|
442 | 439 |
} |
443 | 440 |
FORCE_RET(); |
444 | 441 |
} |
... | ... | |
449 | 446 |
count = T1 & 0x1f; |
450 | 447 |
if (count) { |
451 | 448 |
src = (DATA_STYPE)T0; |
452 |
CC_SRC = src >> (count - 1);
|
|
449 |
CC_SRC = src >> (count - 1); |
|
453 | 450 |
T0 = src >> count; |
454 | 451 |
CC_DST = T0; |
455 | 452 |
CC_OP = CC_OP_SARB + SHIFT; |
... | ... | |
457 | 454 |
FORCE_RET(); |
458 | 455 |
} |
459 | 456 |
|
457 |
#if DATA_BITS == 16 |
|
458 |
/* XXX: overflow flag might be incorrect in some cases in shldw */ |
|
459 |
void OPPROTO glue(glue(op_shld, SUFFIX), _T0_T1_im_cc)(void) |
|
460 |
{ |
|
461 |
int count; |
|
462 |
unsigned int res; |
|
463 |
count = PARAM1; |
|
464 |
T1 &= 0xffff; |
|
465 |
res = T1 | (T0 << 16); |
|
466 |
CC_SRC = res >> (32 - count); |
|
467 |
res <<= count; |
|
468 |
if (count > 16) |
|
469 |
res |= T1 << (count - 16); |
|
470 |
T0 = res >> 16; |
|
471 |
CC_DST = T0; |
|
472 |
} |
|
473 |
|
|
474 |
void OPPROTO glue(glue(op_shld, SUFFIX), _T0_T1_ECX_cc)(void) |
|
475 |
{ |
|
476 |
int count; |
|
477 |
unsigned int res; |
|
478 |
count = ECX & 0x1f; |
|
479 |
if (count) { |
|
480 |
T1 &= 0xffff; |
|
481 |
res = T1 | (T0 << 16); |
|
482 |
CC_SRC = res >> (32 - count); |
|
483 |
res <<= count; |
|
484 |
if (count > 16) |
|
485 |
res |= T1 << (count - 16); |
|
486 |
T0 = res >> 16; |
|
487 |
CC_DST = T0; |
|
488 |
CC_OP = CC_OP_SARB + SHIFT; |
|
489 |
} |
|
490 |
} |
|
491 |
|
|
492 |
void OPPROTO glue(glue(op_shrd, SUFFIX), _T0_T1_im_cc)(void) |
|
493 |
{ |
|
494 |
int count; |
|
495 |
unsigned int res; |
|
496 |
|
|
497 |
count = PARAM1; |
|
498 |
res = (T0 & 0xffff) | (T1 << 16); |
|
499 |
CC_SRC = res >> (count - 1); |
|
500 |
res >>= count; |
|
501 |
if (count > 16) |
|
502 |
res |= T1 << (32 - count); |
|
503 |
T0 = res; |
|
504 |
CC_DST = T0; |
|
505 |
} |
|
506 |
|
|
507 |
|
|
508 |
void OPPROTO glue(glue(op_shrd, SUFFIX), _T0_T1_ECX_cc)(void) |
|
509 |
{ |
|
510 |
int count; |
|
511 |
unsigned int res; |
|
512 |
|
|
513 |
count = ECX & 0x1f; |
|
514 |
if (count) { |
|
515 |
res = (T0 & 0xffff) | (T1 << 16); |
|
516 |
CC_SRC = res >> (count - 1); |
|
517 |
res >>= count; |
|
518 |
if (count > 16) |
|
519 |
res |= T1 << (32 - count); |
|
520 |
T0 = res; |
|
521 |
CC_DST = T0; |
|
522 |
CC_OP = CC_OP_SARB + SHIFT; |
|
523 |
} |
|
524 |
} |
|
525 |
#endif |
|
526 |
|
|
527 |
#if DATA_BITS == 32 |
|
528 |
void OPPROTO glue(glue(op_shld, SUFFIX), _T0_T1_im_cc)(void) |
|
529 |
{ |
|
530 |
int count; |
|
531 |
count = PARAM1; |
|
532 |
T0 &= DATA_MASK; |
|
533 |
T1 &= DATA_MASK; |
|
534 |
CC_SRC = T0 << (count - 1); |
|
535 |
T0 = (T0 << count) | (T1 >> (DATA_BITS - count)); |
|
536 |
CC_DST = T0; |
|
537 |
} |
|
538 |
|
|
539 |
void OPPROTO glue(glue(op_shld, SUFFIX), _T0_T1_ECX_cc)(void) |
|
540 |
{ |
|
541 |
int count; |
|
542 |
count = ECX & 0x1f; |
|
543 |
if (count) { |
|
544 |
T0 &= DATA_MASK; |
|
545 |
T1 &= DATA_MASK; |
|
546 |
CC_SRC = T0 << (count - 1); |
|
547 |
T0 = (T0 << count) | (T1 >> (DATA_BITS - count)); |
|
548 |
CC_DST = T0; |
|
549 |
CC_OP = CC_OP_SHLB + SHIFT; |
|
550 |
} |
|
551 |
} |
|
552 |
|
|
553 |
void OPPROTO glue(glue(op_shrd, SUFFIX), _T0_T1_im_cc)(void) |
|
554 |
{ |
|
555 |
int count; |
|
556 |
count = PARAM1; |
|
557 |
T0 &= DATA_MASK; |
|
558 |
T1 &= DATA_MASK; |
|
559 |
CC_SRC = T0 >> (count - 1); |
|
560 |
T0 = (T0 >> count) | (T1 << (DATA_BITS - count)); |
|
561 |
CC_DST = T0; |
|
562 |
} |
|
563 |
|
|
564 |
|
|
565 |
void OPPROTO glue(glue(op_shrd, SUFFIX), _T0_T1_ECX_cc)(void) |
|
566 |
{ |
|
567 |
int count; |
|
568 |
count = ECX & 0x1f; |
|
569 |
if (count) { |
|
570 |
T0 &= DATA_MASK; |
|
571 |
T1 &= DATA_MASK; |
|
572 |
CC_SRC = T0 >> (count - 1); |
|
573 |
T0 = (T0 >> count) | (T1 << (DATA_BITS - count)); |
|
574 |
CC_DST = T0; |
|
575 |
CC_OP = CC_OP_SARB + SHIFT; |
|
576 |
} |
|
577 |
} |
|
578 |
#endif |
|
579 |
|
|
460 | 580 |
/* carry add/sub (we only need to set CC_OP differently) */ |
461 | 581 |
|
462 | 582 |
void OPPROTO glue(glue(op_adc, SUFFIX), _T0_T1_cc)(void) |
Also available in: Unified diff