//===- subzero/src/IceInst.def - X-macros for ICE instructions -*- C++ -*-===// // // The Subzero Code Generator // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines properties of ICE instructions in the form of x-macros. // //===----------------------------------------------------------------------===// #ifndef SUBZERO_SRC_ICEINST_DEF #define SUBZERO_SRC_ICEINST_DEF // Floating point addition and multiplication are commutative. // 1) non-special values and infinities are required to commute. // 2) signed zeroes are handled by: // From IEEE standard 754-2008: // When the sum of two operands with opposite signs (or the difference of // two operands with like signs) is exactly zero, the sign of that sum // (or difference) shall be +0 in all rounding-direction attributes // except roundTowardNegative; under that attribute, the sign of an exact // zero sum (or difference) shall be −0. // 3) NaNs are handled by: // http://grouper.ieee.org/groups/1788/email/msg03558.html // clause of 754 at work is 6.2.3 NaN propagation: // "If two or more inputs are NaN, then the payload of the resulting NaN // should be identical to the payload of one of the input NaNs if // representable in the destination format. This standard does not // specify which of the input NaNs will provide the payload." #define ICEINSTARITHMETIC_TABLE \ /* enum value, printable string, commutative */ \ X(Add, "add", 1) \ X(Fadd, "fadd", 1) \ X(Sub, "sub", 0) \ X(Fsub, "fsub", 0) \ X(Mul, "mul", 1) \ X(Fmul, "fmul", 1) \ X(Udiv, "udiv", 0) \ X(Sdiv, "sdiv", 0) \ X(Fdiv, "fdiv", 0) \ X(Urem, "urem", 0) \ X(Srem, "srem", 0) \ X(Frem, "frem", 0) \ X(Shl, "shl", 0) \ X(Lshr, "lshr", 0) \ X(Ashr, "ashr", 0) \ X(And, "and", 1) \ X(Or, "or", 1) \ X(Xor, "xor", 1) //#define X(tag, str, commutative) #define ICEINSTCAST_TABLE \ /* enum value, printable string */ \ X(Trunc, "trunc") \ X(Zext, "zext") \ X(Sext, "sext") \ X(Fptrunc, "fptrunc") \ X(Fpext, "fpext") \ X(Fptoui, "fptoui") \ X(Fptosi, "fptosi") \ X(Uitofp, "uitofp") \ X(Sitofp, "sitofp") \ X(Bitcast, "bitcast") //#define X(tag, str) #define ICEINSTFCMP_TABLE \ /* enum value, printable string */ \ X(False, "false") \ X(Oeq, "oeq") \ X(Ogt, "ogt") \ X(Oge, "oge") \ X(Olt, "olt") \ X(Ole, "ole") \ X(One, "one") \ X(Ord, "ord") \ X(Ueq, "ueq") \ X(Ugt, "ugt") \ X(Uge, "uge") \ X(Ult, "ult") \ X(Ule, "ule") \ X(Une, "une") \ X(Uno, "uno") \ X(True, "true") //#define X(tag, str) #define ICEINSTICMP_TABLE \ /* enum value, reverse, printable string */ \ X(Eq, Eq, "eq") \ X(Ne, Ne, "ne") \ X(Ugt, Ult, "ugt") \ X(Uge, Ule, "uge") \ X(Ult, Ugt, "ult") \ X(Ule, Uge, "ule") \ X(Sgt, Slt, "sgt") \ X(Sge, Sle, "sge") \ X(Slt, Sgt, "slt") \ X(Sle, Sge, "sle") //#define X(tag, reverse, str) #endif // SUBZERO_SRC_ICEINST_DEF