//==- 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>; }