dsp.cc (5558:cb98f0fcc6c6) dsp.cc (5563:4c4b5dfc9944)
1/*
2 * Copyright (c) 2007 MIPS Technologies, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 49 unchanged lines hidden (view full) ---

58}
59
60uint64_t
61MipsISA::dspSaturate(uint64_t value, int32_t fmt, int32_t sign,
62 uint32_t *overflow)
63{
64 int64_t svalue = (int64_t)value;
65
1/*
2 * Copyright (c) 2007 MIPS Technologies, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 49 unchanged lines hidden (view full) ---

58}
59
60uint64_t
61MipsISA::dspSaturate(uint64_t value, int32_t fmt, int32_t sign,
62 uint32_t *overflow)
63{
64 int64_t svalue = (int64_t)value;
65
66 switch(sign) {
66 switch (sign) {
67 case SIGNED:
68 if (svalue > (int64_t)FIXED_SMAX[fmt]) {
69 *overflow = 1;
70 svalue = (int64_t)FIXED_SMAX[fmt];
71 } else if (svalue < (int64_t)FIXED_SMIN[fmt]) {
72 *overflow = 1;
73 svalue = (int64_t)FIXED_SMIN[fmt];
74 }

--- 13 unchanged lines hidden (view full) ---

88}
89
90uint64_t
91MipsISA::checkOverflow(uint64_t value, int32_t fmt, int32_t sign,
92 uint32_t *overflow)
93{
94 int64_t svalue = (int64_t)value;
95
67 case SIGNED:
68 if (svalue > (int64_t)FIXED_SMAX[fmt]) {
69 *overflow = 1;
70 svalue = (int64_t)FIXED_SMAX[fmt];
71 } else if (svalue < (int64_t)FIXED_SMIN[fmt]) {
72 *overflow = 1;
73 svalue = (int64_t)FIXED_SMIN[fmt];
74 }

--- 13 unchanged lines hidden (view full) ---

88}
89
90uint64_t
91MipsISA::checkOverflow(uint64_t value, int32_t fmt, int32_t sign,
92 uint32_t *overflow)
93{
94 int64_t svalue = (int64_t)value;
95
96 switch(sign)
96 switch (sign)
97 {
98 case SIGNED:
99 if (svalue > (int64_t)FIXED_SMAX[fmt] ||
100 svalue < (int64_t)FIXED_SMIN[fmt])
101 *overflow = 1;
102 break;
103 case UNSIGNED:
104 if (svalue > (int64_t)FIXED_UMAX[fmt] ||

--- 321 unchanged lines hidden (view full) ---

426 int32_t result;
427 uint32_t ouflag = 0;
428 uint64_t a_values[SIMD_MAX_VALS];
429 uint64_t b_values[SIMD_MAX_VALS];
430
431 simdUnpack(a, a_values, SIMD_FMT_QB, UNSIGNED);
432 simdUnpack(b, b_values, SIMD_FMT_PH, UNSIGNED);
433
97 {
98 case SIGNED:
99 if (svalue > (int64_t)FIXED_SMAX[fmt] ||
100 svalue < (int64_t)FIXED_SMIN[fmt])
101 *overflow = 1;
102 break;
103 case UNSIGNED:
104 if (svalue > (int64_t)FIXED_UMAX[fmt] ||

--- 321 unchanged lines hidden (view full) ---

426 int32_t result;
427 uint32_t ouflag = 0;
428 uint64_t a_values[SIMD_MAX_VALS];
429 uint64_t b_values[SIMD_MAX_VALS];
430
431 simdUnpack(a, a_values, SIMD_FMT_QB, UNSIGNED);
432 simdUnpack(b, b_values, SIMD_FMT_PH, UNSIGNED);
433
434 switch(mode) {
434 switch (mode) {
435 case MODE_L:
436 for (int i = 0; i < nvals; i++)
437 b_values[i] = dspSaturate(a_values[i + 2] * b_values[i],
438 SIMD_FMT_PH, UNSIGNED, &ouflag);
439 break;
440 case MODE_R:
441 for (int i = 0; i < nvals; i++)
442 b_values[i] = dspSaturate(a_values[i] * b_values[i], SIMD_FMT_PH,

--- 18 unchanged lines hidden (view full) ---

461 uint32_t ouflag = 0;
462 uint64_t a_values[SIMD_MAX_VALS];
463 uint64_t b_values[SIMD_MAX_VALS];
464 uint64_t c_values[SIMD_MAX_VALS];
465
466 simdUnpack(a, a_values, SIMD_FMT_PH, SIGNED);
467 simdUnpack(b, b_values, SIMD_FMT_PH, SIGNED);
468
435 case MODE_L:
436 for (int i = 0; i < nvals; i++)
437 b_values[i] = dspSaturate(a_values[i + 2] * b_values[i],
438 SIMD_FMT_PH, UNSIGNED, &ouflag);
439 break;
440 case MODE_R:
441 for (int i = 0; i < nvals; i++)
442 b_values[i] = dspSaturate(a_values[i] * b_values[i], SIMD_FMT_PH,

--- 18 unchanged lines hidden (view full) ---

461 uint32_t ouflag = 0;
462 uint64_t a_values[SIMD_MAX_VALS];
463 uint64_t b_values[SIMD_MAX_VALS];
464 uint64_t c_values[SIMD_MAX_VALS];
465
466 simdUnpack(a, a_values, SIMD_FMT_PH, SIGNED);
467 simdUnpack(b, b_values, SIMD_FMT_PH, SIGNED);
468
469 switch(mode) {
469 switch (mode) {
470 case MODE_L:
471 for (int i = 0; i < nvals; i++)
472 c_values[i] = dspSaturate(a_values[i + 1] * b_values[i + 1] << 1,
473 SIMD_FMT_W, SIGNED, &ouflag);
474 break;
475 case MODE_R:
476 for (int i = 0; i < nvals; i++)
477 c_values[i] = dspSaturate(a_values[i] * b_values[i] << 1,

--- 21 unchanged lines hidden (view full) ---

499 uint32_t ouflag = 0;
500 uint64_t a_values[SIMD_MAX_VALS];
501 uint64_t b_values[SIMD_MAX_VALS];
502
503 simdUnpack(a, a_values, infmt, SIGNED);
504 simdUnpack(b, b_values, infmt, SIGNED);
505
506 for (int i = 0; i < nvals; i++) {
470 case MODE_L:
471 for (int i = 0; i < nvals; i++)
472 c_values[i] = dspSaturate(a_values[i + 1] * b_values[i + 1] << 1,
473 SIMD_FMT_W, SIGNED, &ouflag);
474 break;
475 case MODE_R:
476 for (int i = 0; i < nvals; i++)
477 c_values[i] = dspSaturate(a_values[i] * b_values[i] << 1,

--- 21 unchanged lines hidden (view full) ---

499 uint32_t ouflag = 0;
500 uint64_t a_values[SIMD_MAX_VALS];
501 uint64_t b_values[SIMD_MAX_VALS];
502
503 simdUnpack(a, a_values, infmt, SIGNED);
504 simdUnpack(b, b_values, infmt, SIGNED);
505
506 for (int i = 0; i < nvals; i++) {
507 switch(mode) {
507 switch (mode) {
508 case MODE_X:
509 if (a_values[nvals - 1 - i] == FIXED_SMIN[infmt] &&
510 b_values[i] == FIXED_SMIN[infmt]) {
511 result += FIXED_SMAX[outfmt];
512 ouflag = 1;
513 }
514 else
515 result += a_values[nvals - 1 - i] * b_values[i] << 1;

--- 50 unchanged lines hidden (view full) ---

566 uint32_t ouflag = 0;
567 uint64_t a_values[SIMD_MAX_VALS];
568 uint64_t b_values[SIMD_MAX_VALS];
569
570 simdUnpack(a, a_values, infmt, SIGNED);
571 simdUnpack(b, b_values, infmt, SIGNED);
572
573 for (int i = 0; i < nvals; i++) {
508 case MODE_X:
509 if (a_values[nvals - 1 - i] == FIXED_SMIN[infmt] &&
510 b_values[i] == FIXED_SMIN[infmt]) {
511 result += FIXED_SMAX[outfmt];
512 ouflag = 1;
513 }
514 else
515 result += a_values[nvals - 1 - i] * b_values[i] << 1;

--- 50 unchanged lines hidden (view full) ---

566 uint32_t ouflag = 0;
567 uint64_t a_values[SIMD_MAX_VALS];
568 uint64_t b_values[SIMD_MAX_VALS];
569
570 simdUnpack(a, a_values, infmt, SIGNED);
571 simdUnpack(b, b_values, infmt, SIGNED);
572
573 for (int i = 0; i < nvals; i++) {
574 switch(mode) {
574 switch (mode) {
575 case MODE_X:
576 if (a_values[nvals - 1 - i] == FIXED_SMIN[infmt] &&
577 b_values[i] == FIXED_SMIN[infmt]) {
578 result += FIXED_SMAX[outfmt];
579 ouflag = 1;
580 } else {
581 result += a_values[nvals - 1 - i] * b_values[i] << 1;
582 }

--- 46 unchanged lines hidden (view full) ---

629 int nvals = SIMD_NVALS[fmt];
630 uint64_t a_values[SIMD_MAX_VALS];
631 uint64_t b_values[SIMD_MAX_VALS];
632
633 simdUnpack(a, a_values, fmt, sign);
634 simdUnpack(b, b_values, fmt, sign);
635
636 for (int i = 0; i < 2; i++) {
575 case MODE_X:
576 if (a_values[nvals - 1 - i] == FIXED_SMIN[infmt] &&
577 b_values[i] == FIXED_SMIN[infmt]) {
578 result += FIXED_SMAX[outfmt];
579 ouflag = 1;
580 } else {
581 result += a_values[nvals - 1 - i] * b_values[i] << 1;
582 }

--- 46 unchanged lines hidden (view full) ---

629 int nvals = SIMD_NVALS[fmt];
630 uint64_t a_values[SIMD_MAX_VALS];
631 uint64_t b_values[SIMD_MAX_VALS];
632
633 simdUnpack(a, a_values, fmt, sign);
634 simdUnpack(b, b_values, fmt, sign);
635
636 for (int i = 0; i < 2; i++) {
637 switch(mode) {
637 switch (mode) {
638 case MODE_L:
639 dspac += a_values[nvals - 1 - i] * b_values[nvals - 1 - i];
640 break;
641 case MODE_R:
642 dspac += a_values[nvals - 3 - i] * b_values[nvals - 3 - i];
643 break;
644 case MODE_X:
645 dspac += a_values[nvals - 1 - i] * b_values[i];

--- 11 unchanged lines hidden (view full) ---

657 int nvals = SIMD_NVALS[fmt];
658 uint64_t a_values[SIMD_MAX_VALS];
659 uint64_t b_values[SIMD_MAX_VALS];
660
661 simdUnpack(a, a_values, fmt, sign);
662 simdUnpack(b, b_values, fmt, sign);
663
664 for (int i = 0; i < 2; i++) {
638 case MODE_L:
639 dspac += a_values[nvals - 1 - i] * b_values[nvals - 1 - i];
640 break;
641 case MODE_R:
642 dspac += a_values[nvals - 3 - i] * b_values[nvals - 3 - i];
643 break;
644 case MODE_X:
645 dspac += a_values[nvals - 1 - i] * b_values[i];

--- 11 unchanged lines hidden (view full) ---

657 int nvals = SIMD_NVALS[fmt];
658 uint64_t a_values[SIMD_MAX_VALS];
659 uint64_t b_values[SIMD_MAX_VALS];
660
661 simdUnpack(a, a_values, fmt, sign);
662 simdUnpack(b, b_values, fmt, sign);
663
664 for (int i = 0; i < 2; i++) {
665 switch(mode) {
665 switch (mode) {
666 case MODE_L:
667 dspac -= a_values[nvals - 1 - i] * b_values[nvals - 1 - i];
668 break;
669 case MODE_R:
670 dspac -= a_values[nvals - 3 - i] * b_values[nvals - 3 - i];
671 break;
672 case MODE_X:
673 dspac -= a_values[nvals - 1 - i] * b_values[i];

--- 13 unchanged lines hidden (view full) ---

687 uint64_t b_values[SIMD_MAX_VALS];
688 int64_t temp = 0;
689 uint32_t ouflag = 0;
690
691 simdUnpack(a, a_values, fmt, SIGNED);
692 simdUnpack(b, b_values, fmt, SIGNED);
693
694 for (int i = 0; i < nvals; i++) {
666 case MODE_L:
667 dspac -= a_values[nvals - 1 - i] * b_values[nvals - 1 - i];
668 break;
669 case MODE_R:
670 dspac -= a_values[nvals - 3 - i] * b_values[nvals - 3 - i];
671 break;
672 case MODE_X:
673 dspac -= a_values[nvals - 1 - i] * b_values[i];

--- 13 unchanged lines hidden (view full) ---

687 uint64_t b_values[SIMD_MAX_VALS];
688 int64_t temp = 0;
689 uint32_t ouflag = 0;
690
691 simdUnpack(a, a_values, fmt, SIGNED);
692 simdUnpack(b, b_values, fmt, SIGNED);
693
694 for (int i = 0; i < nvals; i++) {
695 switch(mode) {
695 switch (mode) {
696 case MODE_L:
697 temp = a_values[i + 1] * b_values[i + 1] << 1;
698 if (a_values[i + 1] == FIXED_SMIN[fmt] &&
699 b_values[i + 1] == FIXED_SMIN[fmt]) {
700 temp = (int64_t)FIXED_SMAX[fmt - 1];
701 ouflag = 1;
702 }
703 break;

--- 71 unchanged lines hidden (view full) ---

775 uint64_t b_values[SIMD_MAX_VALS];
776
777 simdUnpack(a, a_values, fmt, sign);
778 simdUnpack(b, b_values, fmt, sign);
779
780 for (int i = 0; i < nvals; i++) {
781 int cc = 0;
782
696 case MODE_L:
697 temp = a_values[i + 1] * b_values[i + 1] << 1;
698 if (a_values[i + 1] == FIXED_SMIN[fmt] &&
699 b_values[i + 1] == FIXED_SMIN[fmt]) {
700 temp = (int64_t)FIXED_SMAX[fmt - 1];
701 ouflag = 1;
702 }
703 break;

--- 71 unchanged lines hidden (view full) ---

775 uint64_t b_values[SIMD_MAX_VALS];
776
777 simdUnpack(a, a_values, fmt, sign);
778 simdUnpack(b, b_values, fmt, sign);
779
780 for (int i = 0; i < nvals; i++) {
781 int cc = 0;
782
783 switch(op) {
783 switch (op) {
784 case CMP_EQ:
785 cc = (a_values[i] == b_values[i]);
786 break;
787 case CMP_LT:
788 cc = (a_values[i] < b_values[i]);
789 break;
790 case CMP_LE:
791 cc = (a_values[i] <= b_values[i]);

--- 15 unchanged lines hidden (view full) ---

807 uint64_t b_values[SIMD_MAX_VALS];
808
809 simdUnpack(a, a_values, fmt, sign);
810 simdUnpack(b, b_values, fmt, sign);
811
812 for (int i = 0; i < nvals; i++) {
813 int cc = 0;
814
784 case CMP_EQ:
785 cc = (a_values[i] == b_values[i]);
786 break;
787 case CMP_LT:
788 cc = (a_values[i] < b_values[i]);
789 break;
790 case CMP_LE:
791 cc = (a_values[i] <= b_values[i]);

--- 15 unchanged lines hidden (view full) ---

807 uint64_t b_values[SIMD_MAX_VALS];
808
809 simdUnpack(a, a_values, fmt, sign);
810 simdUnpack(b, b_values, fmt, sign);
811
812 for (int i = 0; i < nvals; i++) {
813 int cc = 0;
814
815 switch(op) {
815 switch (op) {
816 case CMP_EQ:
817 cc = (a_values[i] == b_values[i]);
818 break;
819 case CMP_LT:
820 cc = (a_values[i] < b_values[i]);
821 break;
822 case CMP_LE:
823 cc = (a_values[i] <= b_values[i]);

--- 17 unchanged lines hidden (view full) ---

841 uint64_t b_values[SIMD_MAX_VALS];
842
843 simdUnpack(a, a_values, fmt, sign);
844 simdUnpack(b, b_values, fmt, sign);
845
846 for (int i = 0; i < nvals; i++) {
847 int cc = 0;
848
816 case CMP_EQ:
817 cc = (a_values[i] == b_values[i]);
818 break;
819 case CMP_LT:
820 cc = (a_values[i] < b_values[i]);
821 break;
822 case CMP_LE:
823 cc = (a_values[i] <= b_values[i]);

--- 17 unchanged lines hidden (view full) ---

841 uint64_t b_values[SIMD_MAX_VALS];
842
843 simdUnpack(a, a_values, fmt, sign);
844 simdUnpack(b, b_values, fmt, sign);
845
846 for (int i = 0; i < nvals; i++) {
847 int cc = 0;
848
849 switch(op) {
849 switch (op) {
850 case CMP_EQ:
851 cc = (a_values[i] == b_values[i]);
852 break;
853 case CMP_LT:
854 cc = (a_values[i] < b_values[i]);
855 break;
856 case CMP_LE:
857 cc = (a_values[i] <= b_values[i]);

--- 25 unchanged lines hidden (view full) ---

883 else if (insign == UNSIGNED && outsign == SIGNED)
884 sa = SIMD_NBITS[infmt] - 1;
885 else if (insign == UNSIGNED && outsign == UNSIGNED)
886 sa = 0;
887
888 simdUnpack(a, in_values, infmt, insign);
889
890 for (int i = 0; i<noutvals; i++) {
850 case CMP_EQ:
851 cc = (a_values[i] == b_values[i]);
852 break;
853 case CMP_LT:
854 cc = (a_values[i] < b_values[i]);
855 break;
856 case CMP_LE:
857 cc = (a_values[i] <= b_values[i]);

--- 25 unchanged lines hidden (view full) ---

883 else if (insign == UNSIGNED && outsign == SIGNED)
884 sa = SIMD_NBITS[infmt] - 1;
885 else if (insign == UNSIGNED && outsign == UNSIGNED)
886 sa = 0;
887
888 simdUnpack(a, in_values, infmt, insign);
889
890 for (int i = 0; i<noutvals; i++) {
891 switch(mode) {
891 switch (mode) {
892 case MODE_L:
893 out_values[i] = in_values[i + (ninvals >> 1)] << sa;
894 break;
895 case MODE_R:
896 out_values[i] = in_values[i] << sa;
897 break;
898 case MODE_LA:
899 out_values[i] = in_values[(i << 1) + 1] << sa;

--- 235 unchanged lines hidden (view full) ---

1135}
1136
1137void
1138MipsISA::simdUnpack(int32_t reg, uint64_t *values_ptr, int32_t fmt, int32_t sign)
1139{
1140 int nvals = SIMD_NVALS[fmt];
1141 int nbits = SIMD_NBITS[fmt];
1142
892 case MODE_L:
893 out_values[i] = in_values[i + (ninvals >> 1)] << sa;
894 break;
895 case MODE_R:
896 out_values[i] = in_values[i] << sa;
897 break;
898 case MODE_LA:
899 out_values[i] = in_values[(i << 1) + 1] << sa;

--- 235 unchanged lines hidden (view full) ---

1135}
1136
1137void
1138MipsISA::simdUnpack(int32_t reg, uint64_t *values_ptr, int32_t fmt, int32_t sign)
1139{
1140 int nvals = SIMD_NVALS[fmt];
1141 int nbits = SIMD_NBITS[fmt];
1142
1143 switch(sign) {
1143 switch (sign) {
1144 case SIGNED:
1145 for (int i = 0; i < nvals; i++) {
1146 uint64_t tmp = (uint64_t)bits(reg, nbits * (i + 1) - 1, nbits * i);
1147 values_ptr[i] = signExtend(tmp, fmt);
1148 }
1149 break;
1150 case UNSIGNED:
1151 for (int i = 0; i < nvals; i++) {

--- 38 unchanged lines hidden ---
1144 case SIGNED:
1145 for (int i = 0; i < nvals; i++) {
1146 uint64_t tmp = (uint64_t)bits(reg, nbits * (i + 1) - 1, nbits * i);
1147 values_ptr[i] = signExtend(tmp, fmt);
1148 }
1149 break;
1150 case UNSIGNED:
1151 for (int i = 0; i < nvals; i++) {

--- 38 unchanged lines hidden ---