| 771 | } |
| 772 | |
| 773 | void kprintf::handleMAD_AND_REDUCE(char **_src, char **_dst) |
| 774 | { |
| 775 | int numCharsWritten = 0; |
| 776 | char id1[256], id2[256], id3[256]; |
| 777 | char * ptr; |
| 778 | char *src = *_src; |
| 779 | char *dst = *_dst; |
| 780 | int vwidth=1; |
| 781 | |
| 782 | ptr = mystrtok( src, "(,)"); |
| 783 | ptr = mystrtok( NULL, "(,)"); // Get first ID |
| 784 | strcpy( id1, ptr); |
| 785 | ptr = mystrtok( NULL, "(,)"); // Get second ID |
| 786 | strcpy( id2, ptr); |
| 787 | ptr = mystrtok( NULL, "(,)"); // Get third ID |
| 788 | strcpy( id3, ptr); |
| 789 | *_src = ptr + strlen(ptr) + 1; |
| 790 | //std::cout << id1 << " " << id2 << " " << id3 << std::endl; |
| 791 | if ( (strcmp(id1, id2) == 0) || (strcmp(id1, id3)==0) || (strcmp(id2,id3) == 0) ) |
| 792 | { |
| 793 | std::cout << "%MAD_AND_REDUCE( C, A, B) : C , A and B have to be UNIQUE" << std::endl; |
| 794 | throw -1; |
| 795 | } |
| 796 | |
| 797 | switch(s_or_v) |
| 798 | { |
| 799 | case SCALAR: |
| 800 | // |
| 801 | // e.g. float += float4*float4 |
| 802 | // We will use only the first vector component |
| 803 | // |
| 804 | if (vectorWidth == 1) |
| 805 | { |
| 806 | numCharsWritten = sprintf(dst, "%s = mad(%s,%s,%s);\n\t", id1, id2, id3, id1); |
| 807 | dst += numCharsWritten; |
| 808 | |
| 809 | } else { |
| 810 | numCharsWritten = sprintf(dst, "%s = mad(%s.%s,%s.%s,%s);\n\t", id1, id2, vecIndices[0], id3, |
| 811 | vecIndices[0], id1); |
| 812 | dst += numCharsWritten; |
| 813 | } |
| 814 | break; |
| 815 | |
| 816 | case VECTOR: |
| 817 | numCharsWritten = sprintf(dst, "%s.S0 = mad((%s).S0,(%s).S0,%s.S0);\n\t", id1, id2, id3, id1); |
| 818 | dst += numCharsWritten; |
| 819 | numCharsWritten = sprintf(dst, "%s.S0 = mad((%s).S1,-(%s.S1),%s.S0);\n\t", id1, id2, id3, id1); |
| 820 | dst += numCharsWritten; |
| 821 | |
| 822 | numCharsWritten = sprintf(dst, "%s.S1 = mad((%s).S0,(%s).S1,%s.S1);\n\t", id1, id2, id3, id1); |
| 823 | dst += numCharsWritten; |
| 824 | numCharsWritten = sprintf(dst, "%s.S1 = mad((%s).S1,(%s.S0),%s.S1);\n\t", id1, id2, id3, id1); |
| 825 | dst += numCharsWritten; |
| 826 | break; |
| 827 | |
| 828 | default: |
| 829 | std::cout << "handleMAD_AND_REDUCE: s_or_v is neither scalar nor a vector" << std::endl; |
| 830 | throw -1; |
nothing calls this directly
no outgoing calls
no test coverage detected