1*03ce13f7SAndroid Build Coastguard Worker//===- subzero/src/IceInst.def - X-macros for ICE instructions -*- C++ -*-===// 2*03ce13f7SAndroid Build Coastguard Worker// 3*03ce13f7SAndroid Build Coastguard Worker// The Subzero Code Generator 4*03ce13f7SAndroid Build Coastguard Worker// 5*03ce13f7SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*03ce13f7SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*03ce13f7SAndroid Build Coastguard Worker// 8*03ce13f7SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*03ce13f7SAndroid Build Coastguard Worker// 10*03ce13f7SAndroid Build Coastguard Worker// This file defines properties of ICE instructions in the form of x-macros. 11*03ce13f7SAndroid Build Coastguard Worker// 12*03ce13f7SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*03ce13f7SAndroid Build Coastguard Worker 14*03ce13f7SAndroid Build Coastguard Worker#ifndef SUBZERO_SRC_ICEINST_DEF 15*03ce13f7SAndroid Build Coastguard Worker#define SUBZERO_SRC_ICEINST_DEF 16*03ce13f7SAndroid Build Coastguard Worker 17*03ce13f7SAndroid Build Coastguard Worker// Floating point addition and multiplication are commutative. 18*03ce13f7SAndroid Build Coastguard Worker// 1) non-special values and infinities are required to commute. 19*03ce13f7SAndroid Build Coastguard Worker// 2) signed zeroes are handled by: 20*03ce13f7SAndroid Build Coastguard Worker// From IEEE standard 754-2008: 21*03ce13f7SAndroid Build Coastguard Worker// When the sum of two operands with opposite signs (or the difference of 22*03ce13f7SAndroid Build Coastguard Worker// two operands with like signs) is exactly zero, the sign of that sum 23*03ce13f7SAndroid Build Coastguard Worker// (or difference) shall be +0 in all rounding-direction attributes 24*03ce13f7SAndroid Build Coastguard Worker// except roundTowardNegative; under that attribute, the sign of an exact 25*03ce13f7SAndroid Build Coastguard Worker// zero sum (or difference) shall be −0. 26*03ce13f7SAndroid Build Coastguard Worker// 3) NaNs are handled by: 27*03ce13f7SAndroid Build Coastguard Worker// http://grouper.ieee.org/groups/1788/email/msg03558.html 28*03ce13f7SAndroid Build Coastguard Worker// clause of 754 at work is 6.2.3 NaN propagation: 29*03ce13f7SAndroid Build Coastguard Worker// "If two or more inputs are NaN, then the payload of the resulting NaN 30*03ce13f7SAndroid Build Coastguard Worker// should be identical to the payload of one of the input NaNs if 31*03ce13f7SAndroid Build Coastguard Worker// representable in the destination format. This standard does not 32*03ce13f7SAndroid Build Coastguard Worker// specify which of the input NaNs will provide the payload." 33*03ce13f7SAndroid Build Coastguard Worker 34*03ce13f7SAndroid Build Coastguard Worker#define ICEINSTARITHMETIC_TABLE \ 35*03ce13f7SAndroid Build Coastguard Worker /* enum value, printable string, commutative */ \ 36*03ce13f7SAndroid Build Coastguard Worker X(Add, "add", 1) \ 37*03ce13f7SAndroid Build Coastguard Worker X(Fadd, "fadd", 1) \ 38*03ce13f7SAndroid Build Coastguard Worker X(Sub, "sub", 0) \ 39*03ce13f7SAndroid Build Coastguard Worker X(Fsub, "fsub", 0) \ 40*03ce13f7SAndroid Build Coastguard Worker X(Mul, "mul", 1) \ 41*03ce13f7SAndroid Build Coastguard Worker X(Fmul, "fmul", 1) \ 42*03ce13f7SAndroid Build Coastguard Worker X(Udiv, "udiv", 0) \ 43*03ce13f7SAndroid Build Coastguard Worker X(Sdiv, "sdiv", 0) \ 44*03ce13f7SAndroid Build Coastguard Worker X(Fdiv, "fdiv", 0) \ 45*03ce13f7SAndroid Build Coastguard Worker X(Urem, "urem", 0) \ 46*03ce13f7SAndroid Build Coastguard Worker X(Srem, "srem", 0) \ 47*03ce13f7SAndroid Build Coastguard Worker X(Frem, "frem", 0) \ 48*03ce13f7SAndroid Build Coastguard Worker X(Shl, "shl", 0) \ 49*03ce13f7SAndroid Build Coastguard Worker X(Lshr, "lshr", 0) \ 50*03ce13f7SAndroid Build Coastguard Worker X(Ashr, "ashr", 0) \ 51*03ce13f7SAndroid Build Coastguard Worker X(And, "and", 1) \ 52*03ce13f7SAndroid Build Coastguard Worker X(Or, "or", 1) \ 53*03ce13f7SAndroid Build Coastguard Worker X(Xor, "xor", 1) 54*03ce13f7SAndroid Build Coastguard Worker//#define X(tag, str, commutative) 55*03ce13f7SAndroid Build Coastguard Worker 56*03ce13f7SAndroid Build Coastguard Worker#define ICEINSTCAST_TABLE \ 57*03ce13f7SAndroid Build Coastguard Worker /* enum value, printable string */ \ 58*03ce13f7SAndroid Build Coastguard Worker X(Trunc, "trunc") \ 59*03ce13f7SAndroid Build Coastguard Worker X(Zext, "zext") \ 60*03ce13f7SAndroid Build Coastguard Worker X(Sext, "sext") \ 61*03ce13f7SAndroid Build Coastguard Worker X(Fptrunc, "fptrunc") \ 62*03ce13f7SAndroid Build Coastguard Worker X(Fpext, "fpext") \ 63*03ce13f7SAndroid Build Coastguard Worker X(Fptoui, "fptoui") \ 64*03ce13f7SAndroid Build Coastguard Worker X(Fptosi, "fptosi") \ 65*03ce13f7SAndroid Build Coastguard Worker X(Uitofp, "uitofp") \ 66*03ce13f7SAndroid Build Coastguard Worker X(Sitofp, "sitofp") \ 67*03ce13f7SAndroid Build Coastguard Worker X(Bitcast, "bitcast") 68*03ce13f7SAndroid Build Coastguard Worker//#define X(tag, str) 69*03ce13f7SAndroid Build Coastguard Worker 70*03ce13f7SAndroid Build Coastguard Worker#define ICEINSTFCMP_TABLE \ 71*03ce13f7SAndroid Build Coastguard Worker /* enum value, printable string */ \ 72*03ce13f7SAndroid Build Coastguard Worker X(False, "false") \ 73*03ce13f7SAndroid Build Coastguard Worker X(Oeq, "oeq") \ 74*03ce13f7SAndroid Build Coastguard Worker X(Ogt, "ogt") \ 75*03ce13f7SAndroid Build Coastguard Worker X(Oge, "oge") \ 76*03ce13f7SAndroid Build Coastguard Worker X(Olt, "olt") \ 77*03ce13f7SAndroid Build Coastguard Worker X(Ole, "ole") \ 78*03ce13f7SAndroid Build Coastguard Worker X(One, "one") \ 79*03ce13f7SAndroid Build Coastguard Worker X(Ord, "ord") \ 80*03ce13f7SAndroid Build Coastguard Worker X(Ueq, "ueq") \ 81*03ce13f7SAndroid Build Coastguard Worker X(Ugt, "ugt") \ 82*03ce13f7SAndroid Build Coastguard Worker X(Uge, "uge") \ 83*03ce13f7SAndroid Build Coastguard Worker X(Ult, "ult") \ 84*03ce13f7SAndroid Build Coastguard Worker X(Ule, "ule") \ 85*03ce13f7SAndroid Build Coastguard Worker X(Une, "une") \ 86*03ce13f7SAndroid Build Coastguard Worker X(Uno, "uno") \ 87*03ce13f7SAndroid Build Coastguard Worker X(True, "true") 88*03ce13f7SAndroid Build Coastguard Worker//#define X(tag, str) 89*03ce13f7SAndroid Build Coastguard Worker 90*03ce13f7SAndroid Build Coastguard Worker#define ICEINSTICMP_TABLE \ 91*03ce13f7SAndroid Build Coastguard Worker /* enum value, reverse, printable string */ \ 92*03ce13f7SAndroid Build Coastguard Worker X(Eq, Eq, "eq") \ 93*03ce13f7SAndroid Build Coastguard Worker X(Ne, Ne, "ne") \ 94*03ce13f7SAndroid Build Coastguard Worker X(Ugt, Ult, "ugt") \ 95*03ce13f7SAndroid Build Coastguard Worker X(Uge, Ule, "uge") \ 96*03ce13f7SAndroid Build Coastguard Worker X(Ult, Ugt, "ult") \ 97*03ce13f7SAndroid Build Coastguard Worker X(Ule, Uge, "ule") \ 98*03ce13f7SAndroid Build Coastguard Worker X(Sgt, Slt, "sgt") \ 99*03ce13f7SAndroid Build Coastguard Worker X(Sge, Sle, "sge") \ 100*03ce13f7SAndroid Build Coastguard Worker X(Slt, Sgt, "slt") \ 101*03ce13f7SAndroid Build Coastguard Worker X(Sle, Sge, "sle") 102*03ce13f7SAndroid Build Coastguard Worker//#define X(tag, reverse, str) 103*03ce13f7SAndroid Build Coastguard Worker 104*03ce13f7SAndroid Build Coastguard Worker#endif // SUBZERO_SRC_ICEINST_DEF 105