1 //===- X86InstrFMA3Info.h - X86 FMA3 Instruction Information ----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains the implementation of the classes providing information 10 // about existing X86 FMA3 opcodes, classifying and grouping them. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_LIB_TARGET_X86_UTILS_X86INSTRFMA3INFO_H 15 #define LLVM_LIB_TARGET_X86_UTILS_X86INSTRFMA3INFO_H 16 17 #include <cstdint> 18 19 namespace llvm { 20 21 /// This class is used to group {132, 213, 231} forms of FMA opcodes together. 22 /// Each of the groups has either 3 opcodes, Also, each group has an attributes 23 /// field describing it. 24 struct X86InstrFMA3Group { 25 /// An array holding 3 forms of FMA opcodes. 26 uint16_t Opcodes[3]; 27 28 /// This bitfield specifies the attributes associated with the created 29 /// FMA groups of opcodes. 30 uint16_t Attributes; 31 32 enum { 33 Form132, 34 Form213, 35 Form231, 36 }; 37 38 enum : uint16_t { 39 /// This bit must be set in the 'Attributes' field of FMA group if such 40 /// group of FMA opcodes consists of FMA intrinsic opcodes. 41 Intrinsic = 0x1, 42 43 /// This bit must be set in the 'Attributes' field of FMA group if such 44 /// group of FMA opcodes consists of AVX512 opcodes accepting a k-mask and 45 /// passing the elements from the 1st operand to the result of the operation 46 /// when the correpondings bits in the k-mask are unset. 47 KMergeMasked = 0x2, 48 49 /// This bit must be set in the 'Attributes' field of FMA group if such 50 /// group of FMA opcodes consists of AVX512 opcodes accepting a k-zeromask. 51 KZeroMasked = 0x4, 52 }; 53 54 /// Returns the 132 form of FMA opcode. get132OpcodeX86InstrFMA3Group55 unsigned get132Opcode() const { 56 return Opcodes[Form132]; 57 } 58 59 /// Returns the 213 form of FMA opcode. get213OpcodeX86InstrFMA3Group60 unsigned get213Opcode() const { 61 return Opcodes[Form213]; 62 } 63 64 /// Returns the 231 form of FMA opcode. get231OpcodeX86InstrFMA3Group65 unsigned get231Opcode() const { 66 return Opcodes[Form231]; 67 } 68 69 /// Returns true iff the group of FMA opcodes holds intrinsic opcodes. isIntrinsicX86InstrFMA3Group70 bool isIntrinsic() const { return (Attributes & Intrinsic) != 0; } 71 72 /// Returns true iff the group of FMA opcodes holds k-merge-masked opcodes. isKMergeMaskedX86InstrFMA3Group73 bool isKMergeMasked() const { 74 return (Attributes & KMergeMasked) != 0; 75 } 76 77 /// Returns true iff the group of FMA opcodes holds k-zero-masked opcodes. isKZeroMaskedX86InstrFMA3Group78 bool isKZeroMasked() const { return (Attributes &KZeroMasked) != 0; } 79 80 /// Returns true iff the group of FMA opcodes holds any of k-masked opcodes. isKMaskedX86InstrFMA3Group81 bool isKMasked() const { 82 return (Attributes & (KMergeMasked | KZeroMasked)) != 0; 83 } 84 85 bool operator<(const X86InstrFMA3Group &RHS) const { 86 return Opcodes[0] < RHS.Opcodes[0]; 87 } 88 }; 89 90 /// Returns a reference to a group of FMA3 opcodes to where the given 91 /// \p Opcode is included. If the given \p Opcode is not recognized as FMA3 92 /// and not included into any FMA3 group, then nullptr is returned. 93 const X86InstrFMA3Group *getFMA3Group(unsigned Opcode, uint64_t TSFlags); 94 95 } // end namespace llvm 96 97 #endif // LLVM_LIB_TARGET_X86_UTILS_X86INSTRFMA3INFO_H 98