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) { |
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) |
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) { |
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) { |
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) { |
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) { |
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) { |
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) { |
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) { |
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) { |
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) { |
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) { |
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) { |
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) { |
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 --- |