|  | //==- SystemZInstrDFP.td - Floating-point SystemZ instructions -*- tblgen-*-==// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // The instructions in this file implement SystemZ decimal floating-point | 
|  | // arithmetic.  These instructions are inot currently used for code generation, | 
|  | // are provided for use with the assembler and disassembler only.  If LLVM | 
|  | // ever supports decimal floating-point types (_Decimal64 etc.), they can | 
|  | // also be used for code generation for those types. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // Move instructions | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // Load and test. | 
|  | let Defs = [CC] in { | 
|  | def LTDTR : UnaryRRE<"ltdtr", 0xB3D6, null_frag, FP64,  FP64>; | 
|  | def LTXTR : UnaryRRE<"ltxtr", 0xB3DE, null_frag, FP128, FP128>; | 
|  | } | 
|  |  | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // Conversion instructions | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // Convert floating-point values to narrower representations.  The destination | 
|  | // of LDXTR is a 128-bit value, but only the first register of the pair is used. | 
|  | def LEDTR : TernaryRRFe<"ledtr", 0xB3D5, FP32,  FP64>; | 
|  | def LDXTR : TernaryRRFe<"ldxtr", 0xB3DD, FP128, FP128>; | 
|  |  | 
|  | // Extend floating-point values to wider representations. | 
|  | def LDETR : BinaryRRFd<"ldetr", 0xB3D4, FP64,  FP32>; | 
|  | def LXDTR : BinaryRRFd<"lxdtr", 0xB3DC, FP128, FP64>; | 
|  |  | 
|  | // Convert a signed integer value to a floating-point one. | 
|  | def CDGTR : UnaryRRE<"cdgtr", 0xB3F1, null_frag, FP64,  GR64>; | 
|  | def CXGTR : UnaryRRE<"cxgtr", 0xB3F9, null_frag, FP128, GR64>; | 
|  | let Predicates = [FeatureFPExtension] in { | 
|  | def CDGTRA : TernaryRRFe<"cdgtra", 0xB3F1, FP64,  GR64>; | 
|  | def CXGTRA : TernaryRRFe<"cxgtra", 0xB3F9, FP128, GR64>; | 
|  | def CDFTR : TernaryRRFe<"cdftr", 0xB951, FP64,  GR32>; | 
|  | def CXFTR : TernaryRRFe<"cxftr", 0xB959, FP128, GR32>; | 
|  | } | 
|  |  | 
|  | // Convert an unsigned integer value to a floating-point one. | 
|  | let Predicates = [FeatureFPExtension] in { | 
|  | def CDLGTR : TernaryRRFe<"cdlgtr", 0xB952, FP64,  GR64>; | 
|  | def CXLGTR : TernaryRRFe<"cxlgtr", 0xB95A, FP128, GR64>; | 
|  | def CDLFTR : TernaryRRFe<"cdlftr", 0xB953, FP64,  GR32>; | 
|  | def CXLFTR : TernaryRRFe<"cxlftr", 0xB95B, FP128, GR32>; | 
|  | } | 
|  |  | 
|  | // Convert a floating-point value to a signed integer value. | 
|  | let Defs = [CC] in { | 
|  | def CGDTR : BinaryRRFe<"cgdtr", 0xB3E1, GR64, FP64>; | 
|  | def CGXTR : BinaryRRFe<"cgxtr", 0xB3E9, GR64, FP128>; | 
|  | let Predicates = [FeatureFPExtension] in { | 
|  | def CGDTRA : TernaryRRFe<"cgdtra", 0xB3E1, GR64, FP64>; | 
|  | def CGXTRA : TernaryRRFe<"cgxtra", 0xB3E9, GR64, FP128>; | 
|  | def CFDTR : TernaryRRFe<"cfdtr", 0xB941, GR32, FP64>; | 
|  | def CFXTR : TernaryRRFe<"cfxtr", 0xB949, GR32, FP128>; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Convert a floating-point value to an unsigned integer value. | 
|  | let Defs = [CC] in { | 
|  | let Predicates = [FeatureFPExtension] in { | 
|  | def CLGDTR : TernaryRRFe<"clgdtr", 0xB942, GR64, FP64>; | 
|  | def CLGXTR : TernaryRRFe<"clgxtr", 0xB94A, GR64, FP128>; | 
|  | def CLFDTR : TernaryRRFe<"clfdtr", 0xB943, GR32, FP64>; | 
|  | def CLFXTR : TernaryRRFe<"clfxtr", 0xB94B, GR32, FP128>; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Convert a packed value to a floating-point one. | 
|  | def CDSTR : UnaryRRE<"cdstr", 0xB3F3, null_frag, FP64,  GR64>; | 
|  | def CXSTR : UnaryRRE<"cxstr", 0xB3FB, null_frag, FP128, GR128>; | 
|  | def CDUTR : UnaryRRE<"cdutr", 0xB3F2, null_frag, FP64,  GR64>; | 
|  | def CXUTR : UnaryRRE<"cxutr", 0xB3FA, null_frag, FP128, GR128>; | 
|  |  | 
|  | // Convert a floating-point value to a packed value. | 
|  | def CSDTR : BinaryRRFd<"csdtr", 0xB3E3, GR64,  FP64>; | 
|  | def CSXTR : BinaryRRFd<"csxtr", 0xB3EB, GR128, FP128>; | 
|  | def CUDTR : UnaryRRE<"cudtr", 0xB3E2, null_frag, GR64,  FP64>; | 
|  | def CUXTR : UnaryRRE<"cuxtr", 0xB3EA, null_frag, GR128, FP128>; | 
|  |  | 
|  | // Convert from/to memory values in the zoned format. | 
|  | let Predicates = [FeatureDFPZonedConversion] in { | 
|  | def CDZT : BinaryRSL<"cdzt", 0xEDAA, FP64>; | 
|  | def CXZT : BinaryRSL<"cxzt", 0xEDAB, FP128>; | 
|  | def CZDT : StoreBinaryRSL<"czdt", 0xEDA8, FP64>; | 
|  | def CZXT : StoreBinaryRSL<"czxt", 0xEDA9, FP128>; | 
|  | } | 
|  |  | 
|  | // Convert from/to memory values in the packed format. | 
|  | let Predicates = [FeatureDFPPackedConversion] in { | 
|  | def CDPT : BinaryRSL<"cdpt", 0xEDAE, FP64>; | 
|  | def CXPT : BinaryRSL<"cxpt", 0xEDAF, FP128>; | 
|  | def CPDT : StoreBinaryRSL<"cpdt", 0xEDAC, FP64>; | 
|  | def CPXT : StoreBinaryRSL<"cpxt", 0xEDAD, FP128>; | 
|  | } | 
|  |  | 
|  | // Perform floating-point operation. | 
|  | let Defs = [CC, R1L, F0Q], Uses = [R0L, F4Q] in | 
|  | def PFPO : SideEffectInherentE<"pfpo", 0x010A>; | 
|  |  | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // Unary arithmetic | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // Round to an integer, with the second operand (M3) specifying the rounding | 
|  | // mode.  M4 can be set to 4 to suppress detection of inexact conditions. | 
|  | def FIDTR : TernaryRRFe<"fidtr", 0xB3D7, FP64,  FP64>; | 
|  | def FIXTR : TernaryRRFe<"fixtr", 0xB3DF, FP128, FP128>; | 
|  |  | 
|  | // Extract biased exponent. | 
|  | def EEDTR : UnaryRRE<"eedtr", 0xB3E5, null_frag, FP64,  FP64>; | 
|  | def EEXTR : UnaryRRE<"eextr", 0xB3ED, null_frag, FP128, FP128>; | 
|  |  | 
|  | // Extract significance. | 
|  | def ESDTR : UnaryRRE<"esdtr", 0xB3E7, null_frag, FP64,  FP64>; | 
|  | def ESXTR : UnaryRRE<"esxtr", 0xB3EF, null_frag, FP128, FP128>; | 
|  |  | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // Binary arithmetic | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // Addition. | 
|  | let Defs = [CC] in { | 
|  | let isCommutable = 1 in { | 
|  | def ADTR : BinaryRRFa<"adtr", 0xB3D2, null_frag, FP64,  FP64,  FP64>; | 
|  | def AXTR : BinaryRRFa<"axtr", 0xB3DA, null_frag, FP128, FP128, FP128>; | 
|  | } | 
|  | let Predicates = [FeatureFPExtension] in { | 
|  | def ADTRA : TernaryRRFa<"adtra", 0xB3D2, FP64,  FP64,  FP64>; | 
|  | def AXTRA : TernaryRRFa<"axtra", 0xB3DA, FP128, FP128, FP128>; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Subtraction. | 
|  | let Defs = [CC] in { | 
|  | def SDTR : BinaryRRFa<"sdtr", 0xB3D3, null_frag, FP64,  FP64,  FP64>; | 
|  | def SXTR : BinaryRRFa<"sxtr", 0xB3DB, null_frag, FP128, FP128, FP128>; | 
|  | let Predicates = [FeatureFPExtension] in { | 
|  | def SDTRA : TernaryRRFa<"sdtra", 0xB3D3, FP64,  FP64,  FP64>; | 
|  | def SXTRA : TernaryRRFa<"sxtra", 0xB3DB, FP128, FP128, FP128>; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Multiplication. | 
|  | let isCommutable = 1 in { | 
|  | def MDTR : BinaryRRFa<"mdtr", 0xB3D0, null_frag, FP64,  FP64,  FP64>; | 
|  | def MXTR : BinaryRRFa<"mxtr", 0xB3D8, null_frag, FP128, FP128, FP128>; | 
|  | } | 
|  | let Predicates = [FeatureFPExtension] in { | 
|  | def MDTRA : TernaryRRFa<"mdtra", 0xB3D0, FP64,  FP64,  FP64>; | 
|  | def MXTRA : TernaryRRFa<"mxtra", 0xB3D8, FP128, FP128, FP128>; | 
|  | } | 
|  |  | 
|  | // Division. | 
|  | def DDTR : BinaryRRFa<"ddtr", 0xB3D1, null_frag, FP64,  FP64,  FP64>; | 
|  | def DXTR : BinaryRRFa<"dxtr", 0xB3D9, null_frag, FP128, FP128, FP128>; | 
|  | let Predicates = [FeatureFPExtension] in { | 
|  | def DDTRA : TernaryRRFa<"ddtra", 0xB3D1, FP64,  FP64,  FP64>; | 
|  | def DXTRA : TernaryRRFa<"dxtra", 0xB3D9, FP128, FP128, FP128>; | 
|  | } | 
|  |  | 
|  | // Quantize. | 
|  | def QADTR : TernaryRRFb<"qadtr", 0xB3F5, FP64,  FP64,  FP64>; | 
|  | def QAXTR : TernaryRRFb<"qaxtr", 0xB3FD, FP128, FP128, FP128>; | 
|  |  | 
|  | // Reround. | 
|  | def RRDTR : TernaryRRFb<"rrdtr", 0xB3F7, FP64,  FP64,  FP64>; | 
|  | def RRXTR : TernaryRRFb<"rrxtr", 0xB3FF, FP128, FP128, FP128>; | 
|  |  | 
|  | // Shift significand left/right. | 
|  | def SLDT : BinaryRXF<"sldt", 0xED40, null_frag, FP64,  FP64,  null_frag, 0>; | 
|  | def SLXT : BinaryRXF<"slxt", 0xED48, null_frag, FP128, FP128, null_frag, 0>; | 
|  | def SRDT : BinaryRXF<"srdt", 0xED41, null_frag, FP64,  FP64,  null_frag, 0>; | 
|  | def SRXT : BinaryRXF<"srxt", 0xED49, null_frag, FP128, FP128, null_frag, 0>; | 
|  |  | 
|  | // Insert biased exponent. | 
|  | def IEDTR : BinaryRRFb<"iedtr", 0xB3F6, null_frag, FP64,  FP64,   FP64>; | 
|  | def IEXTR : BinaryRRFb<"iextr", 0xB3FE, null_frag, FP128, FP128, FP128>; | 
|  |  | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // Comparisons | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // Compare. | 
|  | let Defs = [CC] in { | 
|  | def CDTR : CompareRRE<"cdtr", 0xB3E4, null_frag, FP64,  FP64>; | 
|  | def CXTR : CompareRRE<"cxtr", 0xB3EC, null_frag, FP128, FP128>; | 
|  | } | 
|  |  | 
|  | // Compare and signal. | 
|  | let Defs = [CC] in { | 
|  | def KDTR : CompareRRE<"kdtr", 0xB3E0, null_frag, FP64,  FP64>; | 
|  | def KXTR : CompareRRE<"kxtr", 0xB3E8, null_frag, FP128, FP128>; | 
|  | } | 
|  |  | 
|  | // Compare biased exponent. | 
|  | let Defs = [CC] in { | 
|  | def CEDTR : CompareRRE<"cedtr", 0xB3F4, null_frag, FP64,  FP64>; | 
|  | def CEXTR : CompareRRE<"cextr", 0xB3FC, null_frag, FP128, FP128>; | 
|  | } | 
|  |  | 
|  | // Test Data Class. | 
|  | let Defs = [CC] in { | 
|  | def TDCET : TestRXE<"tdcet", 0xED50, null_frag, FP32>; | 
|  | def TDCDT : TestRXE<"tdcdt", 0xED54, null_frag, FP64>; | 
|  | def TDCXT : TestRXE<"tdcxt", 0xED58, null_frag, FP128>; | 
|  | } | 
|  |  | 
|  | // Test Data Group. | 
|  | let Defs = [CC] in { | 
|  | def TDGET : TestRXE<"tdget", 0xED51, null_frag, FP32>; | 
|  | def TDGDT : TestRXE<"tdgdt", 0xED55, null_frag, FP64>; | 
|  | def TDGXT : TestRXE<"tdgxt", 0xED59, null_frag, FP128>; | 
|  | } | 
|  |  |