//===-- AMDILMultiClass.td - AMDIL Multiclass defs ---*- tablegen -*-------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //==-----------------------------------------------------------------------===// // Multiclass that handles branch instructions multiclass BranchConditional { def _i8 : ILFormat; def _i16 : ILFormat; def _i32 : ILFormat; def _f32 : ILFormat; def _i64 : ILFormat; def _f64 : ILFormat; } // Multiclass that handles compare instructions // When a definition is added here, a corrosponding defition // needs to be added at: // AMDILISelLowering.cpp@EmitInstrWithCustomInserter multiclass Compare { def _i8 : ILFormat; def _i16 : ILFormat; def _i32 : ILFormat; def _i64 : ILFormat; def _f32 : ILFormat; def _f64 : ILFormat; def _v2i8 : ILFormat; def _v2i16 : ILFormat; def _v2i32 : ILFormat; def _v2i64 : ILFormat; def _v2f32 : ILFormat; def _v2f64 : ILFormat; def _v4i8 : ILFormat; def _v4i16 : ILFormat; def _v4i32 : ILFormat; def _v4f32 : ILFormat; } // Multiclass that handles constant values multiclass ILConstant { def _i8 : ILFormat; // def _v2i8 : ILFormat; //def _v4i8 : ILFormat; def _i16 : ILFormat; // def _v2i16 : ILFormat; // def _v4i16 : ILFormat; def _i32 : ILFormat; // def _v2i32 : ILFormat; // def _v4i32 : ILFormat; def _i64 : ILFormat; // def _v2i64 : ILFormat; def _f32 : ILFormat; // def _v2f32 : ILFormat; // def _v4f32 : ILFormat; def _f64 : ILFormat; // def _v2f64 : ILFormat; } // Multiclass that handles memory store operations multiclass GTRUNCSTORE { def _i16i8 : OneInOneOut; def _i32i8 : OneInOneOut; def _i64i8 : OneInOneOut; def _i32i16 : OneInOneOut; def _i64i16 : OneInOneOut; def _i64i32 : OneInOneOut; def _f64f32 : OneInOneOut; def _v2i32i8 : OneInOneOut; def _v4i32i8 : OneInOneOut; def _v2i16i8 : OneInOneOut; def _v4i16i8 : OneInOneOut; def _v2i32i16 : OneInOneOut; def _v4i32i16 : OneInOneOut; def _v2f64f32 : OneInOneOut; def _v2i64i8 : OneInOneOut; def _v2i64i16 : OneInOneOut; def _v2i64i32 : OneInOneOut; } // Multiclass that handles memory store operations multiclass LTRUNCSTORE { def _i16i8 : OneInOneOut; def _i32i8 : OneInOneOut; def _i64i8 : OneInOneOut; def _i32i16 : OneInOneOut; def _i64i16 : OneInOneOut; def _i64i32 : OneInOneOut; def _f64f32 : OneInOneOut; def _v2i32i8 : OneInOneOut; def _v4i32i8 : OneInOneOut; def _v2i16i8 : OneInOneOut; def _v4i16i8 : OneInOneOut; def _v2i32i16 : OneInOneOut; def _v4i32i16 : OneInOneOut; def _v2f64f32 : OneInOneOut; def _v2i64i8 : OneInOneOut; def _v2i64i16 : OneInOneOut; def _v2i64i32 : OneInOneOut; } // Multiclass that handles memory store operations multiclass PTRUNCSTORE { def _i16i8 : OneInOneOut; def _i32i8 : OneInOneOut; def _i64i8 : OneInOneOut; def _i32i16 : OneInOneOut; def _i64i16 : OneInOneOut; def _i64i32 : OneInOneOut; def _f64f32 : OneInOneOut; def _v2i32i8 : OneInOneOut; def _v4i32i8 : OneInOneOut; def _v2i16i8 : OneInOneOut; def _v4i16i8 : OneInOneOut; def _v2i32i16 : OneInOneOut; def _v4i32i16 : OneInOneOut; def _v2f64f32 : OneInOneOut; def _v2i64i8 : OneInOneOut; def _v2i64i16 : OneInOneOut; def _v2i64i32 : OneInOneOut; } // Multiclass that handles memory store operations multiclass RTRUNCSTORE { def _i16i8 : OneInOneOut; def _i32i8 : OneInOneOut; def _i64i8 : OneInOneOut; def _i32i16 : OneInOneOut; def _i64i16 : OneInOneOut; def _i64i32 : OneInOneOut; def _f64f32 : OneInOneOut; def _v2i32i8 : OneInOneOut; def _v4i32i8 : OneInOneOut; def _v2i16i8 : OneInOneOut; def _v4i16i8 : OneInOneOut; def _v2i32i16 : OneInOneOut; def _v4i32i16 : OneInOneOut; def _v2f64f32 : OneInOneOut; def _v2i64i8 : OneInOneOut; def _v2i64i16 : OneInOneOut; def _v2i64i32 : OneInOneOut; } // Multiclass that handles memory store operations multiclass STORE { def _i8 : OneInOneOut; def _i16 : OneInOneOut; def _i32 : OneInOneOut; def _f32 : OneInOneOut; def _i64 : OneInOneOut; def _f64 : OneInOneOut; def _v4f32 : OneInOneOut; def _v2f32 : OneInOneOut; def _v4i32 : OneInOneOut; def _v2i8 : OneInOneOut; def _v2i16 : OneInOneOut; def _v4i8 : OneInOneOut; def _v4i16 : OneInOneOut; def _v2i32 : OneInOneOut; def _v2f64 : OneInOneOut; def _v2i64 : OneInOneOut; } // Multiclass that handles load operations multiclass LOAD { def _i8 : OneInOneOut; def _i16 : OneInOneOut; def _i32 : OneInOneOut; def _f32 : OneInOneOut; def _i64 : OneInOneOut; def _f64 : OneInOneOut; def _v4f32 : OneInOneOut; def _v2f32 : OneInOneOut; def _v2f64 : OneInOneOut; def _v4i32 : OneInOneOut; def _v2i8 : OneInOneOut; def _v2i16 : OneInOneOut; def _v4i8 : OneInOneOut; def _v4i16 : OneInOneOut; def _v2i32 : OneInOneOut; def _v2i64 : OneInOneOut; } // Multiclass that handles memory store operations multiclass GTRUNCSTORE64 { def _i16i8 : OneInOneOut; def _i32i8 : OneInOneOut; def _i64i8 : OneInOneOut; def _i32i16 : OneInOneOut; def _i64i16 : OneInOneOut; def _i64i32 : OneInOneOut; def _f64f32 : OneInOneOut; def _v2i32i8 : OneInOneOut; def _v4i32i8 : OneInOneOut; def _v2i16i8 : OneInOneOut; def _v4i16i8 : OneInOneOut; def _v2i32i16 : OneInOneOut; def _v4i32i16 : OneInOneOut; def _v2f64f32 : OneInOneOut; def _v2i64i8 : OneInOneOut; def _v2i64i16 : OneInOneOut; def _v2i64i32 : OneInOneOut; } // Multiclass that handles memory store operations multiclass LTRUNCSTORE64 { def _i16i8 : OneInOneOut; def _i32i8 : OneInOneOut; def _i64i8 : OneInOneOut; def _i32i16 : OneInOneOut; def _i64i16 : OneInOneOut; def _i64i32 : OneInOneOut; def _f64f32 : OneInOneOut; def _v2i32i8 : OneInOneOut; def _v4i32i8 : OneInOneOut; def _v2i16i8 : OneInOneOut; def _v4i16i8 : OneInOneOut; def _v2i32i16 : OneInOneOut; def _v4i32i16 : OneInOneOut; def _v2f64f32 : OneInOneOut; def _v2i64i8 : OneInOneOut; def _v2i64i16 : OneInOneOut; def _v2i64i32 : OneInOneOut; } // Multiclass that handles memory store operations multiclass PTRUNCSTORE64 { def _i16i8 : OneInOneOut; def _i32i8 : OneInOneOut; def _i64i8 : OneInOneOut; def _i32i16 : OneInOneOut; def _i64i16 : OneInOneOut; def _i64i32 : OneInOneOut; def _f64f32 : OneInOneOut; def _v2i32i8 : OneInOneOut; def _v4i32i8 : OneInOneOut; def _v2i16i8 : OneInOneOut; def _v4i16i8 : OneInOneOut; def _v2i32i16 : OneInOneOut; def _v4i32i16 : OneInOneOut; def _v2f64f32 : OneInOneOut; def _v2i64i8 : OneInOneOut; def _v2i64i16 : OneInOneOut; def _v2i64i32 : OneInOneOut; } // Multiclass that handles memory store operations multiclass RTRUNCSTORE64 { def _i16i8 : OneInOneOut; def _i32i8 : OneInOneOut; def _i64i8 : OneInOneOut; def _i32i16 : OneInOneOut; def _i64i16 : OneInOneOut; def _i64i32 : OneInOneOut; def _f64f32 : OneInOneOut; def _v2i32i8 : OneInOneOut; def _v4i32i8 : OneInOneOut; def _v2i16i8 : OneInOneOut; def _v4i16i8 : OneInOneOut; def _v2i32i16 : OneInOneOut; def _v4i32i16 : OneInOneOut; def _v2f64f32 : OneInOneOut; def _v2i64i8 : OneInOneOut; def _v2i64i16 : OneInOneOut; def _v2i64i32 : OneInOneOut; } // Multiclass that handles memory store operations multiclass STORE64 { def _i8 : OneInOneOut; def _i16 : OneInOneOut; def _i32 : OneInOneOut; def _f32 : OneInOneOut; def _i64 : OneInOneOut; def _f64 : OneInOneOut; def _v4f32 : OneInOneOut; def _v2f32 : OneInOneOut; def _v4i32 : OneInOneOut; def _v2i8 : OneInOneOut; def _v2i16 : OneInOneOut; def _v4i8 : OneInOneOut; def _v4i16 : OneInOneOut; def _v2i32 : OneInOneOut; def _v2f64 : OneInOneOut; def _v2i64 : OneInOneOut; } // Multiclass that handles load operations multiclass LOAD64 { def _i8 : OneInOneOut; def _i16 : OneInOneOut; def _i32 : OneInOneOut; def _f32 : OneInOneOut; def _i64 : OneInOneOut; def _f64 : OneInOneOut; def _v4f32 : OneInOneOut; def _v2f32 : OneInOneOut; def _v2f64 : OneInOneOut; def _v4i32 : OneInOneOut; def _v2i8 : OneInOneOut; def _v2i16 : OneInOneOut; def _v4i8 : OneInOneOut; def _v4i16 : OneInOneOut; def _v2i32 : OneInOneOut; def _v2i64 : OneInOneOut; } // Only scalar types should generate flow control multiclass BranchInstr { def _i8 : UnaryOpNoRet; def _i16 : UnaryOpNoRet; def _i32 : UnaryOpNoRet; def _i64 : UnaryOpNoRet; def _f32 : UnaryOpNoRet; def _f64 : UnaryOpNoRet; } // Only scalar types should generate flow control multiclass BranchInstr2 { def _i8 : BinaryOpNoRet; def _i16 : BinaryOpNoRet; def _i32 : BinaryOpNoRet; def _i64 : BinaryOpNoRet; def _f32 : BinaryOpNoRet; def _f64 : BinaryOpNoRet; } // Class that handles the various vector extract patterns multiclass VectorExtract { def _v2f64 : ExtractVectorClass; def _v4f32: ExtractVectorClass; def _v2f32 : ExtractVectorClass; def _v2i64 : ExtractVectorClass; def _v4i8 : ExtractVectorClass; def _v4i16 : ExtractVectorClass; def _v4i32 : ExtractVectorClass; def _v2i8 : ExtractVectorClass; def _v2i16 : ExtractVectorClass; def _v2i32 : ExtractVectorClass; } multiclass VectorConcat { def _v2f64 : VectorConcatClass; def _v2i64 : VectorConcatClass; def _v4f32 : VectorConcatClass; def _v4i32 : VectorConcatClass; def _v4i16 : VectorConcatClass; def _v4i8 : VectorConcatClass; def _v2f32 : VectorConcatClass; def _v2i32 : VectorConcatClass; def _v2i16 : VectorConcatClass; def _v2i8 : VectorConcatClass; } // Class that handles the various vector insert patterns multiclass VectorInsert { def _v2f64 : InsertVectorClass; def _v4f32: InsertVectorClass; def _v2f32 : InsertVectorClass; def _v2i64 : InsertVectorClass; def _v4i8 : InsertVectorClass; def _v4i16 : InsertVectorClass; def _v4i32 : InsertVectorClass; def _v2i8 : InsertVectorClass; def _v2i16 : InsertVectorClass; def _v2i32 : InsertVectorClass; } // generic class that handles math instruction for OneInOneOut instruction // patterns multiclass UnaryOpMC { def _i8 : UnaryOp; def _i16 : UnaryOp; def _i32 : UnaryOp; def _f32 : UnaryOp; def _f64 : UnaryOp; def _i64 : UnaryOp; def _v4f32: UnaryOp; def _v4i16 : UnaryOp; def _v4i8 : UnaryOp; def _v4i32 : UnaryOp; def _v2f32 : UnaryOp; def _v2i16 : UnaryOp; def _v2i8 : UnaryOp; def _v2i32 : UnaryOp; def _v2f64 : UnaryOp; def _v2i64 : UnaryOp; } multiclass UnaryOpMCVec { def _v4f32: UnaryOp; def _v4i16 : UnaryOp; def _v4i8 : UnaryOp; def _v4i32 : UnaryOp; def _v2f32 : UnaryOp; def _v2i16 : UnaryOp; def _v2i8 : UnaryOp; def _v2i32 : UnaryOp; def _v2f64 : UnaryOp; def _v2i64 : UnaryOp; } multiclass UnaryOpMCf32< ILOpCode f32OpCode, SDNode OpNode> { def _f32 : UnaryOp; def _v4f32: UnaryOp; def _v2f32 : UnaryOp; } multiclass UnaryOpMCi32< ILOpCode i32OpCode, SDNode OpNode> { def _i8 : UnaryOp; def _i16 : UnaryOp; def _i32 : UnaryOp; def _v4i16 : UnaryOp; def _v4i8 : UnaryOp; def _v4i32 : UnaryOp; def _v2i16 : UnaryOp; def _v2i8 : UnaryOp; def _v2i32 : UnaryOp; } multiclass BinaryOpMC { def _i8 : BinaryOp; def _i16 : BinaryOp; def _i32 : BinaryOp; def _f32 : BinaryOp; def _f64 : BinaryOp; def _i64 : BinaryOp; def _v4f32: BinaryOp; def _v4i16 : BinaryOp; def _v4i8 : BinaryOp; def _v4i32 : BinaryOp; def _v2f32 : BinaryOp; def _v2i16 : BinaryOp; def _v2i8 : BinaryOp; def _v2i32 : BinaryOp; def _v2f64 : BinaryOp; def _v2i64 : BinaryOp; } multiclass BinaryOpMCInt { def _i8 : BinaryOp; def _i16 : BinaryOp; def _i32 : BinaryOp; def _i64 : BinaryOp; def _v4i16 : BinaryOp; def _v4i8 : BinaryOp; def _v4i32 : BinaryOp; def _v2i16 : BinaryOp; def _v2i8 : BinaryOp; def _v2i32 : BinaryOp; def _v2i64 : BinaryOp; } // generic class that handles math instruction for ThreeInOneOut // instruction patterns multiclass TernaryOpMC { def _i8 : TernaryOp; def _i16 : TernaryOp; def _i32 : TernaryOp; def _f32 : TernaryOp; def _f64 : TernaryOp; def _i64 : TernaryOp; def _v4f32: TernaryOp; def _v4i8 : TernaryOp; def _v4i16 : TernaryOp; def _v4i32 : TernaryOp; def _v2f32 : TernaryOp; def _v2i8 : TernaryOp; def _v2i16 : TernaryOp; def _v2i32 : TernaryOp; def _v2f64 : TernaryOp; def _v2i64 : TernaryOp; } multiclass BinaryOpMCi32 { def _i8 : BinaryOp; def _i16 : BinaryOp; def _i32 : BinaryOp; def _v4i16 : BinaryOp; def _v4i8 : BinaryOp; def _v4i32 : BinaryOp; def _v2i16 : BinaryOp; def _v2i8 : BinaryOp; def _v2i32 : BinaryOp; } multiclass BinaryOpMCi64 { def _i64 : BinaryOp; def _v2i64 : BinaryOp; } multiclass BinaryOpMCi32Const { def _i8 : BinaryOp; def _i16 : BinaryOp; def _i32 : BinaryOp; def _v4i16 : BinaryOp; def _v4i8 : BinaryOp; def _v4i32 : BinaryOp; def _v2i16 : BinaryOp; def _v2i8 : BinaryOp; def _v2i32 : BinaryOp; } multiclass BinaryOpMCf32 { def _f32 : BinaryOp; def _v4f32: BinaryOp; def _v2f32 : BinaryOp; } multiclass TernaryOpMCf64 { def _f64 : TernaryOp; } multiclass TernaryOpMCf32 { def _f32 : TernaryOp; def _v4f32: TernaryOp; def _v2f32 : TernaryOp; } multiclass BinaryOpMCFloat { def _f64 : BinaryOp; def _v2f64 : BinaryOp; def _f32 : BinaryOp; def _v2f32 : BinaryOp; def _v4f32: BinaryOp; } multiclass TernaryOpMCScalar { def _i8: TernaryOp; def _i16: TernaryOp; def _i32: TernaryOp; def _i64: TernaryOp; def _f32: TernaryOp; def _f64: TernaryOp; } multiclass BitConversion { def _i8 : UnaryOp; def _i16 : UnaryOp; def _i32 : UnaryOp; def _f32 : UnaryOp; def _i64 : UnaryOp; def _f64 : UnaryOp; def _v2i8 : UnaryOp; def _v2i16 : UnaryOp; def _v2i32 : UnaryOp; def _v2f32 : UnaryOp; def _v2i64 : UnaryOp; def _v2f64 : UnaryOp; def _v4i8 : UnaryOp; def _v4i16 : UnaryOp; def _v4i32 : UnaryOp; def _v4f32 : UnaryOp; } multiclass UnaryIntrinsicInt { def _i32 : OneInOneOut; def _v2i32 : OneInOneOut; def _v4i32 : OneInOneOut; } multiclass IntrConvertF32TOF16 { def _i16 : OneInOneOut; def _v2i16 : OneInOneOut; def _v4i16 : OneInOneOut; } multiclass IntrConvertF32TOI32 { def _i32 : OneInOneOut; def _v2i32 : OneInOneOut; def _v4i32 : OneInOneOut; } multiclass IntrConvertF64TOI32 { def _i32 : OneInOneOut; def _v2i32 : OneInOneOut; } multiclass IntrConvertF16TOF32 { def _f32 : OneInOneOut; def _v2f32 : OneInOneOut; def _v4f32 : OneInOneOut; } multiclass IntrConvertI32TOF32 { def _f32 : OneInOneOut; def _v2f32 : OneInOneOut; def _v4f32 : OneInOneOut; } multiclass BinaryIntrinsicLong { def _i64 : TwoInOneOut; } multiclass BinaryIntrinsicInt { def _i32 : TwoInOneOut; def _v2i32 : TwoInOneOut; def _v4i32 : TwoInOneOut; } multiclass TernaryIntrinsicInt { def _i32 : ThreeInOneOut; def _v2i32 : ThreeInOneOut; def _v4i32 : ThreeInOneOut; } multiclass TernaryIntrinsicFloat { def _f32 : ThreeInOneOut; def _v2f32 : ThreeInOneOut; def _v4f32 : ThreeInOneOut; } multiclass BinaryIntrinsicDoubleScalar { def _f64 : ThreeInOneOut; } multiclass TernaryIntrinsicDoubleScalar { def _f64 : ThreeInOneOut; } multiclass TernaryIntrinsicLongScalar { def _i64 : ThreeInOneOut; } multiclass QuaternaryIntrinsicInt { def _i32 : FourInOneOut; def _v2i32 : FourInOneOut; def _v4i32 : FourInOneOut; } multiclass UnaryIntrinsicFloatScalar { def _f32 : OneInOneOut; } multiclass UnaryIntrinsicFloat { def _f32 : OneInOneOut; def _v2f32 : OneInOneOut; def _v4f32 : OneInOneOut; } multiclass BinaryIntrinsicFloatScalar { def _f32 : TwoInOneOut; } multiclass BinaryIntrinsicFloat { def _f32 : TwoInOneOut; def _v2f32 : TwoInOneOut; def _v4f32 : TwoInOneOut; } multiclass UnaryIntrinsicDoubleScalar { def _f64 : OneInOneOut; } multiclass UnaryIntrinsicDouble { def _f64 : OneInOneOut; def _v2f64 : OneInOneOut; } multiclass BinaryIntrinsicDouble { def _f64 : TwoInOneOut; def _v2f64 : TwoInOneOut; } multiclass TernaryIntrinsicDouble { def _f64 : TwoInOneOut; def _v2f64 : TwoInOneOut; }