LLVM: lib/Target/X86/X86InstrFMA3Info.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

16#include

17#include

18#include

19

20using namespace llvm;

21

22#define FMA3GROUP(Name, Suf, Attrs) \

23 { { X86::Name##132##Suf, X86::Name##213##Suf, X86::Name##231##Suf }, Attrs },

24

25#define FMA3GROUP_MASKED(Name, Suf, Attrs) \

26 FMA3GROUP(Name, Suf, Attrs) \

27 FMA3GROUP(Name, Suf##k, Attrs | X86InstrFMA3Group::KMergeMasked) \

28 FMA3GROUP(Name, Suf##kz, Attrs | X86InstrFMA3Group::KZeroMasked)

29

30#define FMA3GROUP_MASKED_INT(Name, Suf, Attrs) \

31 FMA3GROUP(Name, Suf##_Int, Attrs) \

32 FMA3GROUP(Name, Suf##k_Int, Attrs | X86InstrFMA3Group::KMergeMasked) \

33 FMA3GROUP(Name, Suf##kz_Int, Attrs | X86InstrFMA3Group::KZeroMasked)

34

35#define FMA3GROUP_PACKED_WIDTHS_Z(Name, Suf, Attrs) \

36 FMA3GROUP_MASKED(Name, Suf##Z128m, Attrs) \

37 FMA3GROUP_MASKED(Name, Suf##Z128r, Attrs) \

38 FMA3GROUP_MASKED(Name, Suf##Z256m, Attrs) \

39 FMA3GROUP_MASKED(Name, Suf##Z256r, Attrs) \

40 FMA3GROUP_MASKED(Name, Suf##Zm, Attrs) \

41 FMA3GROUP_MASKED(Name, Suf##Zr, Attrs) \

42

43#define FMA3GROUP_PACKED_WIDTHS_ALL(Name, Suf, Attrs) \

44 FMA3GROUP(Name, Suf##Ym, Attrs) \

45 FMA3GROUP(Name, Suf##Yr, Attrs) \

46 FMA3GROUP_PACKED_WIDTHS_Z(Name, Suf, Attrs) \

47 FMA3GROUP(Name, Suf##m, Attrs) \

48 FMA3GROUP(Name, Suf##r, Attrs)

49

50#define FMA3GROUP_PACKED_DHS(Name, Attrs) \

51 FMA3GROUP_PACKED_WIDTHS_ALL(Name, PD, Attrs) \

52 FMA3GROUP_PACKED_WIDTHS_Z(Name, PH, Attrs) \

53 FMA3GROUP_PACKED_WIDTHS_ALL(Name, PS, Attrs)

54

55#define FMA3GROUP_PACKED_BF16(Name, Attrs) \

56 FMA3GROUP_PACKED_WIDTHS_Z(Name, BF16, Attrs)

57

58#define FMA3GROUP_SCALAR_WIDTHS_Z(Name, Suf, Attrs) \

59 FMA3GROUP(Name, Suf##Zm, Attrs) \

60 FMA3GROUP_MASKED_INT(Name, Suf##Zm, Attrs | X86InstrFMA3Group::Intrinsic) \

61 FMA3GROUP(Name, Suf##Zr, Attrs) \

62 FMA3GROUP_MASKED_INT(Name, Suf##Zr, Attrs | X86InstrFMA3Group::Intrinsic) \

63

64#define FMA3GROUP_SCALAR_WIDTHS_ALL(Name, Suf, Attrs) \

65 FMA3GROUP_SCALAR_WIDTHS_Z(Name, Suf, Attrs) \

66 FMA3GROUP(Name, Suf##m, Attrs) \

67 FMA3GROUP(Name, Suf##m_Int, Attrs | X86InstrFMA3Group::Intrinsic) \

68 FMA3GROUP(Name, Suf##r, Attrs) \

69 FMA3GROUP(Name, Suf##r_Int, Attrs | X86InstrFMA3Group::Intrinsic)

70

71#define FMA3GROUP_SCALAR(Name, Attrs) \

72 FMA3GROUP_SCALAR_WIDTHS_ALL(Name, SD, Attrs) \

73 FMA3GROUP_SCALAR_WIDTHS_Z(Name, SH, Attrs) \

74 FMA3GROUP_SCALAR_WIDTHS_ALL(Name, SS, Attrs)

75

76#define FMA3GROUP_FULL(Name, Attrs) \

77 FMA3GROUP_PACKED_BF16(Name, Attrs) \

78 FMA3GROUP_PACKED_DHS(Name, Attrs) \

79 FMA3GROUP_SCALAR(Name, Attrs)

80

89

90#define FMA3GROUP_PACKED_AVX512_WIDTHS(Name, Type, Suf, Attrs) \

91 FMA3GROUP_MASKED(Name, Type##Z128##Suf, Attrs) \

92 FMA3GROUP_MASKED(Name, Type##Z256##Suf, Attrs) \

93 FMA3GROUP_MASKED(Name, Type##Z##Suf, Attrs)

94

95#define FMA3GROUP_PACKED_AVX512_ALL(Name, Suf, Attrs) \

96 FMA3GROUP_PACKED_AVX512_WIDTHS(Name, BF16, Suf, Attrs) \

97 FMA3GROUP_PACKED_AVX512_WIDTHS(Name, PD, Suf, Attrs) \

98 FMA3GROUP_PACKED_AVX512_WIDTHS(Name, PH, Suf, Attrs) \

99 FMA3GROUP_PACKED_AVX512_WIDTHS(Name, PS, Suf, Attrs)

100

101#define FMA3GROUP_PACKED_AVX512_DHS(Name, Suf, Attrs) \

102 FMA3GROUP_PACKED_AVX512_WIDTHS(Name, PD, Suf, Attrs) \

103 FMA3GROUP_PACKED_AVX512_WIDTHS(Name, PH, Suf, Attrs) \

104 FMA3GROUP_PACKED_AVX512_WIDTHS(Name, PS, Suf, Attrs)

105

106#define FMA3GROUP_PACKED_AVX512_ROUND(Name, Suf, Attrs) \

107 FMA3GROUP_MASKED(Name, PDZ##Suf, Attrs) \

108 FMA3GROUP_MASKED(Name, PHZ##Suf, Attrs) \

109 FMA3GROUP_MASKED(Name, PSZ##Suf, Attrs)

110

111#define FMA3GROUP_SCALAR_AVX512_ROUND(Name, Suf, Attrs) \

112 FMA3GROUP(Name, SDZ##Suf, Attrs) \

113 FMA3GROUP_MASKED_INT(Name, SDZ##Suf, Attrs) \

114 FMA3GROUP(Name, SHZ##Suf, Attrs) \

115 FMA3GROUP_MASKED_INT(Name, SHZ##Suf, Attrs) \

116 FMA3GROUP(Name, SSZ##Suf, Attrs) \

117 FMA3GROUP_MASKED_INT(Name, SSZ##Suf, Attrs)

118

127

140

142#ifndef NDEBUG

143 static std::atomic TableChecked(false);

144 if (!TableChecked.load(std::memory_order_relaxed)) {

147 TableChecked.store(true, std::memory_order_relaxed);

148 }

149#endif

150}

151

152

153

154

156

157

159 bool IsFMA3Opcode = ((BaseOpcode >= 0x96 && BaseOpcode <= 0x9F) ||

160 (BaseOpcode >= 0xA6 && BaseOpcode <= 0xAF) ||

161 (BaseOpcode >= 0xB6 && BaseOpcode <= 0xBF));

169 if (!IsFMA3Opcode || !IsFMA3Encoding || !IsFMA3Prefix)

170 return nullptr;

171

173

179 else

181

182

183

184

185 unsigned FormIndex = ((BaseOpcode - 0x90) >> 4) & 0x3;

186

188 return Group.Opcodes[FormIndex] < Opcode;

189 });

190 assert(I != Table.end() && I->Opcodes[FormIndex] == Opcode &&

191 "Couldn't find FMA3 opcode!");

192 return I;

193}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static void verifyTables()

Definition X86InstrFMA3Info.cpp:141

#define FMA3GROUP_PACKED_AVX512_ROUND(Name, Suf, Attrs)

Definition X86InstrFMA3Info.cpp:106

#define FMA3GROUP_PACKED_AVX512_ALL(Name, Suf, Attrs)

Definition X86InstrFMA3Info.cpp:95

#define FMA3GROUP_PACKED_AVX512_DHS(Name, Suf, Attrs)

Definition X86InstrFMA3Info.cpp:101

#define FMA3GROUP_SCALAR_AVX512_ROUND(Name, Suf, Attrs)

Definition X86InstrFMA3Info.cpp:111

static const X86InstrFMA3Group RoundGroups[]

Definition X86InstrFMA3Info.cpp:128

static const X86InstrFMA3Group Groups[]

Definition X86InstrFMA3Info.cpp:81

static const X86InstrFMA3Group BroadcastGroups[]

Definition X86InstrFMA3Info.cpp:119

#define FMA3GROUP_PACKED_DHS(Name, Attrs)

Definition X86InstrFMA3Info.cpp:50

#define FMA3GROUP_FULL(Name, Attrs)

Definition X86InstrFMA3Info.cpp:76

ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...

@ EVEX

EVEX - Specifies that this instruction use EVEX form which provides syntax support up to 32 512-bit r...

@ VEX

VEX - encoding using 0xC4/0xC5.

@ PD

PD - Prefix code for packed double precision vector floating point operations performed in the SSE re...

@ T8

T8, TA - Prefix after the 0x0F prefix.

uint8_t getBaseOpcodeFor(uint64_t TSFlags)

This is an optimization pass for GlobalISel generic memory operations.

auto partition_point(R &&Range, Predicate P)

Binary search for the first iterator in a range where a predicate is false.

const X86InstrFMA3Group * getFMA3Group(unsigned Opcode, uint64_t TSFlags)

Returns a reference to a group of FMA3 opcodes to where the given Opcode is included.

Definition X86InstrFMA3Info.cpp:155

bool is_sorted(R &&Range, Compare C)

Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...

ArrayRef(const T &OneElt) -> ArrayRef< T >

This class is used to group {132, 213, 231} forms of FMA opcodes together.

uint16_t Opcodes[3]

An array holding 3 forms of FMA opcodes.

@ Intrinsic

This bit must be set in the 'Attributes' field of FMA group if such group of FMA opcodes consists of ...