Changeset 3817 in CLRX


Ignore:
Timestamp:
Feb 17, 2018, 9:50:22 AM (14 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmExpr?: Handle special cases with binary and logical AND/OR/XOR operationns between relatives and absolutes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdasm/AsmExpression.cpp

    r3781 r3817  
    628628                        break;
    629629                    case AsmExprOp::BIT_AND:
    630                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     630                    {
     631                        bool norel1 = CHKSREL(relatives);
     632                        bool norel2 = CHKSREL(relatives2);
     633                        if ((norel1 && value==0) || (norel2 && value2==0))
     634                        {
     635                            relatives.clear();
     636                            value = 0;
     637                        }
     638                        else if (norel1 && value==UINT64_MAX)
     639                        {
     640                            relatives.assign(relatives2.begin(), relatives2.end());
     641                            value = value2;
     642                        }
     643                        else if (norel2 && value2==UINT64_MAX)
     644                        { } // keep old value
     645                        else if (!norel1 || !norel2)
    631646                            ASMX_FAILED_BY_ERROR(sourcePos,
    632647                                 "Binary AND is not allowed for any relative value")
    633                         value = value2 & value;
    634                         break;
     648                        else
     649                            value = value2 & value;
     650                        break;
     651                    }
    635652                    case AsmExprOp::BIT_OR:
    636                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     653                    {
     654                        bool norel1 = CHKSREL(relatives);
     655                        bool norel2 = CHKSREL(relatives2);
     656                        if ((norel1 && value==UINT64_MAX) || (norel2 && value2==UINT64_MAX))
     657                        {
     658                            relatives.clear();
     659                            value = UINT64_MAX;
     660                        }
     661                        else if (norel1 && value==0)
     662                        {
     663                            relatives.assign(relatives2.begin(), relatives2.end());
     664                            value = value2;
     665                        }
     666                        else if (norel2 && value2==0)
     667                        { } // keep old value
     668                        else if (!norel1 || !norel2)
    637669                            ASMX_FAILED_BY_ERROR(sourcePos,
    638670                                 "Binary OR is not allowed for any relative value")
    639                         value = value2 | value;
    640                         break;
     671                        else
     672                            value = value2 | value;
     673                        break;
     674                    }
    641675                    case AsmExprOp::BIT_XOR:
    642                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     676                    {
     677                        bool norel1 = CHKSREL(relatives);
     678                        bool norel2 = CHKSREL(relatives2);
     679                        if (norel1 && value==0)
     680                        {
     681                            relatives.assign(relatives2.begin(), relatives2.end());
     682                            value = value2;
     683                        }
     684                        else if (norel2 && value2==0)
     685                        { } // keep old value
     686                        else if (!norel1 || !norel2)
    643687                            ASMX_FAILED_BY_ERROR(sourcePos,
    644688                                 "Binary XOR is not allowed for any relative value")
    645                         value = value2 ^ value;
    646                         break;
     689                        else
     690                            value = value2 ^ value;
     691                        break;
     692                    }
    647693                    case AsmExprOp::BIT_ORNOT:
    648                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     694                    {
     695                        bool norel1 = CHKSREL(relatives);
     696                        bool norel2 = CHKSREL(relatives2);
     697                        if ((norel1 && value==0) || (norel2 && value2==UINT64_MAX))
     698                        {
     699                            relatives.clear();
     700                            value = UINT64_MAX;
     701                        }
     702                        else if (norel1 && value==UINT64_MAX)
     703                        {
     704                            relatives.assign(relatives2.begin(), relatives2.end());
     705                            value = value2;
     706                        }
     707                        else if (norel2 && value2 == 0)
     708                        {
     709                            // 0 | ~v
     710                            for (RelMultiply& r: relatives)
     711                                r.multiply = -r.multiply;
     712                            value = ~value;
     713                        }
     714                        else if (!norel1 || !norel2)
    649715                            ASMX_FAILED_BY_ERROR(sourcePos,
    650716                                 "Binary ORNOT is not allowed for any relative value")
    651                         value = value2 | ~value;
    652                         break;
     717                        else
     718                            value = value2 | ~value;
     719                        break;
     720                    }
    653721                    case AsmExprOp::SHIFT_LEFT:
    654722                        if (!CHKSREL(relatives))
     
    699767                        break;
    700768                    case AsmExprOp::LOGICAL_AND:
    701                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     769                    {
     770                        bool norel1 = CHKSREL(relatives);
     771                        bool norel2 = CHKSREL(relatives2);
     772                        if ((norel1 && value==0) || (norel2 && value2==0))
     773                        {
     774                            relatives.clear();
     775                            value = 0;
     776                        }
     777                        else if (!norel1 || !norel2)
    702778                            ASMX_FAILED_BY_ERROR(sourcePos,
    703779                                 "Logical AND is not allowed for any relative value")
    704                         value = value2 && value;
    705                         break;
     780                        else
     781                            value = value2 && value;
     782                        break;
     783                    }
    706784                    case AsmExprOp::LOGICAL_OR:
    707                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     785                    {
     786                        bool norel1 = CHKSREL(relatives);
     787                        bool norel2 = CHKSREL(relatives2);
     788                        if ((norel1 && value!=0) || (norel2 && value2!=0))
     789                        {
     790                            relatives.clear();
     791                            value = 1;
     792                        }
     793                        else if (!CHKSREL(relatives) || !CHKSREL(relatives2))
    708794                            ASMX_FAILED_BY_ERROR(sourcePos,
    709795                                 "Logical OR is not allowed for any relative value")
    710                         value = value2 || value;
    711                         break;
     796                        else
     797                            value = value2 || value;
     798                        break;
     799                    }
    712800                    case AsmExprOp::EQUAL:
    713801                    case AsmExprOp::NOT_EQUAL:
Note: See TracChangeset for help on using the changeset viewer.