3

私の同僚は、LLVM ソース コードから次のマクロを見せてくれました。

#define IMPLEMENT_UNORDERED(TY, X,Y)                                         \
    if (TY->isFloatTy()) {                                                   \
        if (X.FloatVal != X.FloatVal || Y.FloatVal != Y.FloatVal) {          \
            return Dest;                                                     \
        }                                                                    \
    } else if (X.DoubleVal != X.DoubleVal || Y.DoubleVal != Y.DoubleVal) {   \
            Dest.IntVal = APInt(1,true);                                     \
            return Dest;                                                     \
}

このマクロの使用方法は次のとおりです。

static GenericValue executeFCMP_UEQ(GenericValue Src1, GenericValue Src2,
                                    Type *Ty) {
    GenericValue Dest;
    IMPLEMENT_UNORDERED(Ty, Src1, Src2)
    return executeFCMP_OEQ(Src1, Src2, Ty);
}

以下に、 GenericValueの定義を示します。

struct GenericValue {
    union {
        double          DoubleVal;
        float           FloatVal;
        PointerTy       PointerVal;
        struct { unsigned int first; unsigned int second; } UIntPairVal;
        unsigned char   Untyped[8];
    };
    APInt IntVal;   // also used for long doubles

    GenericValue() : DoubleVal(0.0), IntVal(1,0) {}
    explicit GenericValue(void *V) : PointerVal(V), IntVal(1,0) { }
};

私の質問は、マクロ内に次の不等式テストがある理由です。

X.FloatVal != X.FloatVal
4

1 に答える 1

5

彼らは NaN (数値ではない) をテストしていると思います: もしxNaN 値を持っていればx != xtrue.

于 2012-11-02T21:05:51.893 に答える