summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86InstrFMA3Info.cpp
blob: 3819e5791d64896324eb38765e38ffe03a041c0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
//===-- X86InstrFMA3Info.cpp - X86 FMA3 Instruction Information -----------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the implementation of the classes providing information
// about existing X86 FMA3 opcodes, classifying and grouping them.
//
//===----------------------------------------------------------------------===//

#include "X86InstrFMA3Info.h"
#include "X86InstrInfo.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/Threading.h"
#include <cassert>
#include <cstdint>

using namespace llvm;

static ManagedStatic<X86InstrFMA3Info> X86InstrFMA3InfoObj;
X86InstrFMA3Info *X86InstrFMA3Info::getX86InstrFMA3Info() {
  return &*X86InstrFMA3InfoObj;
}

#define FMA3BASE(R132, R213, R231, M132, M213, M231, Attrs)                    \
  { { R132, R213, R231 }, { M132, M213, M231 }, Attrs },

#define FMA3RMA(R132, R213, R231, M132, M213, M231, Attrs)                     \
  FMA3BASE(X86::R132, X86::R213, X86::R231, X86::M132, X86::M213, X86::M231, Attrs)

#define FMA3RM(R132, R213, R231, M132, M213, M231)                             \
  FMA3RMA(R132, R213, R231, M132, M213, M231, 0)

#define FMA3RA(R132, R213, R231, Attrs)                                        \
  FMA3BASE(X86::R132, X86::R213, X86::R231, 0, 0, 0, Attrs)

#define FMA3R(R132, R213, R231)                                                \
  FMA3RA(R132, R213, R231, 0)

#define FMA3MA(M132, M213, M231, Attrs)                                        \
  FMA3BASE(0, 0, 0, X86::M132, X86::M213, X86::M231, Attrs)

#define FMA3M(M132, M213, M231)                                                \
  FMA3MA(M132, M213, M231, 0)

#define FMA3_AVX2_VECTOR_GROUP(Name)                                           \
  FMA3RM(Name##132PSr, Name##213PSr, Name##231PSr,                             \
         Name##132PSm, Name##213PSm, Name##231PSm)                             \
  FMA3RM(Name##132PDr, Name##213PDr, Name##231PDr,                             \
         Name##132PDm, Name##213PDm, Name##231PDm)                             \
  FMA3RM(Name##132PSYr, Name##213PSYr, Name##231PSYr,                          \
         Name##132PSYm, Name##213PSYm, Name##231PSYm)                          \
  FMA3RM(Name##132PDYr, Name##213PDYr, Name##231PDYr,                          \
         Name##132PDYm, Name##213PDYm, Name##231PDYm)

#define FMA3_AVX2_SCALAR_GROUP(Name)                                           \
  FMA3RM(Name##132SSr, Name##213SSr, Name##231SSr,                             \
         Name##132SSm, Name##213SSm, Name##231SSm)                             \
  FMA3RM(Name##132SDr, Name##213SDr, Name##231SDr,                             \
         Name##132SDm, Name##213SDm, Name##231SDm)                             \
  FMA3RMA(Name##132SSr_Int, Name##213SSr_Int, Name##231SSr_Int,                \
          Name##132SSm_Int, Name##213SSm_Int, Name##231SSm_Int,                \
          X86InstrFMA3Group::X86FMA3Intrinsic)                                 \
  FMA3RMA(Name##132SDr_Int, Name##213SDr_Int, Name##231SDr_Int,                \
          Name##132SDm_Int, Name##213SDm_Int, Name##231SDm_Int,                \
          X86InstrFMA3Group::X86FMA3Intrinsic)

#define FMA3_AVX2_FULL_GROUP(Name)                                             \
  FMA3_AVX2_VECTOR_GROUP(Name)                                                 \
  FMA3_AVX2_SCALAR_GROUP(Name)

#define FMA3_AVX512_VECTOR_GROUP(Name)                                         \
  FMA3RM(Name##132PSZ128r, Name##213PSZ128r, Name##231PSZ128r,                 \
         Name##132PSZ128m, Name##213PSZ128m, Name##231PSZ128m)                 \
  FMA3RM(Name##132PDZ128r, Name##213PDZ128r, Name##231PDZ128r,                 \
         Name##132PDZ128m, Name##213PDZ128m, Name##231PDZ128m)                 \
  FMA3RM(Name##132PSZ256r, Name##213PSZ256r, Name##231PSZ256r,                 \
         Name##132PSZ256m, Name##213PSZ256m, Name##231PSZ256m)                 \
  FMA3RM(Name##132PDZ256r, Name##213PDZ256r, Name##231PDZ256r,                 \
         Name##132PDZ256m, Name##213PDZ256m, Name##231PDZ256m)                 \
  FMA3RM(Name##132PSZr,    Name##213PSZr,    Name##231PSZr,                    \
         Name##132PSZm,    Name##213PSZm,    Name##231PSZm)                    \
  FMA3RM(Name##132PDZr,    Name##213PDZr,    Name##231PDZr,                    \
         Name##132PDZm,    Name##213PDZm,    Name##231PDZm)                    \
  FMA3RMA(Name##132PSZ128rk, Name##213PSZ128rk, Name##231PSZ128rk,             \
          Name##132PSZ128mk, Name##213PSZ128mk, Name##231PSZ128mk,             \
          X86InstrFMA3Group::X86FMA3KMergeMasked)                              \
  FMA3RMA(Name##132PDZ128rk, Name##213PDZ128rk, Name##231PDZ128rk,             \
          Name##132PDZ128mk, Name##213PDZ128mk, Name##231PDZ128mk,             \
          X86InstrFMA3Group::X86FMA3KMergeMasked)                              \
  FMA3RMA(Name##132PSZ256rk, Name##213PSZ256rk, Name##231PSZ256rk,             \
          Name##132PSZ256mk, Name##213PSZ256mk, Name##231PSZ256mk,             \
          X86InstrFMA3Group::X86FMA3KMergeMasked)                              \
  FMA3RMA(Name##132PDZ256rk, Name##213PDZ256rk, Name##231PDZ256rk,             \
          Name##132PDZ256mk, Name##213PDZ256mk, Name##231PDZ256mk,             \
          X86InstrFMA3Group::X86FMA3KMergeMasked)                              \
  FMA3RMA(Name##132PSZrk,    Name##213PSZrk,    Name##231PSZrk,                \
          Name##132PSZmk,    Name##213PSZmk,    Name##231PSZmk,                \
          X86InstrFMA3Group::X86FMA3KMergeMasked)                              \
  FMA3RMA(Name##132PDZrk,    Name##213PDZrk,    Name##231PDZrk,                \
          Name##132PDZmk,    Name##213PDZmk,    Name##231PDZmk,                \
          X86InstrFMA3Group::X86FMA3KMergeMasked)                              \
  FMA3RMA(Name##132PSZ128rkz, Name##213PSZ128rkz, Name##231PSZ128rkz,          \
          Name##132PSZ128mkz, Name##213PSZ128mkz, Name##231PSZ128mkz,          \
          X86InstrFMA3Group::X86FMA3KZeroMasked)                               \
  FMA3RMA(Name##132PDZ128rkz, Name##213PDZ128rkz, Name##231PDZ128rkz,          \
          Name##132PDZ128mkz, Name##213PDZ128mkz, Name##231PDZ128mkz,          \
          X86InstrFMA3Group::X86FMA3KZeroMasked)                               \
  FMA3RMA(Name##132PSZ256rkz, Name##213PSZ256rkz, Name##231PSZ256rkz,          \
          Name##132PSZ256mkz, Name##213PSZ256mkz, Name##231PSZ256mkz,          \
          X86InstrFMA3Group::X86FMA3KZeroMasked)                               \
  FMA3RMA(Name##132PDZ256rkz, Name##213PDZ256rkz, Name##231PDZ256rkz,          \
          Name##132PDZ256mkz, Name##213PDZ256mkz, Name##231PDZ256mkz,          \
          X86InstrFMA3Group::X86FMA3KZeroMasked)                               \
  FMA3RMA(Name##132PSZrkz,    Name##213PSZrkz,    Name##231PSZrkz,             \
          Name##132PSZmkz,    Name##213PSZmkz,    Name##231PSZmkz,             \
          X86InstrFMA3Group::X86FMA3KZeroMasked)                               \
  FMA3RMA(Name##132PDZrkz,    Name##213PDZrkz,    Name##231PDZrkz,             \
          Name##132PDZmkz,    Name##213PDZmkz,    Name##231PDZmkz,             \
          X86InstrFMA3Group::X86FMA3KZeroMasked)                               \
  FMA3R(Name##132PSZrb, Name##213PSZrb, Name##231PSZrb)                        \
  FMA3R(Name##132PDZrb, Name##213PDZrb, Name##231PDZrb)                        \
  FMA3RA(Name##132PSZrbk, Name##213PSZrbk, Name##231PSZrbk,                    \
         X86InstrFMA3Group::X86FMA3KMergeMasked)                               \
  FMA3RA(Name##132PDZrbk, Name##213PDZrbk, Name##231PDZrbk,                    \
         X86InstrFMA3Group::X86FMA3KMergeMasked)                               \
  FMA3RA(Name##132PSZrbkz, Name##213PSZrbkz, Name##231PSZrbkz,                 \
         X86InstrFMA3Group::X86FMA3KZeroMasked)                                \
  FMA3RA(Name##132PDZrbkz, Name##213PDZrbkz, Name##231PDZrbkz,                 \
         X86InstrFMA3Group::X86FMA3KZeroMasked)                                \
  FMA3M(Name##132PSZ128mb, Name##213PSZ128mb, Name##231PSZ128mb)               \
  FMA3M(Name##132PDZ128mb, Name##213PDZ128mb, Name##231PDZ128mb)               \
  FMA3M(Name##132PSZ256mb, Name##213PSZ256mb, Name##231PSZ256mb)               \
  FMA3M(Name##132PDZ256mb, Name##213PDZ256mb, Name##231PDZ256mb)               \
  FMA3M(Name##132PSZmb, Name##213PSZmb, Name##231PSZmb)                        \
  FMA3M(Name##132PDZmb, Name##213PDZmb, Name##231PDZmb)                        \
  FMA3MA(Name##132PSZ128mbk, Name##213PSZ128mbk, Name##231PSZ128mbk,           \
         X86InstrFMA3Group::X86FMA3KMergeMasked)                               \
  FMA3MA(Name##132PDZ128mbk, Name##213PDZ128mbk, Name##231PDZ128mbk,           \
         X86InstrFMA3Group::X86FMA3KMergeMasked)                               \
  FMA3MA(Name##132PSZ256mbk, Name##213PSZ256mbk, Name##231PSZ256mbk,           \
         X86InstrFMA3Group::X86FMA3KMergeMasked)                               \
  FMA3MA(Name##132PDZ256mbk, Name##213PDZ256mbk, Name##231PDZ256mbk,           \
         X86InstrFMA3Group::X86FMA3KMergeMasked)                               \
  FMA3MA(Name##132PSZmbk,    Name##213PSZmbk,    Name##231PSZmbk,              \
         X86InstrFMA3Group::X86FMA3KMergeMasked)                               \
  FMA3MA(Name##132PDZmbk,    Name##213PDZmbk,    Name##231PDZmbk,              \
         X86InstrFMA3Group::X86FMA3KMergeMasked)                               \
  FMA3MA(Name##132PSZ128mbkz, Name##213PSZ128mbkz, Name##231PSZ128mbkz,        \
         X86InstrFMA3Group::X86FMA3KZeroMasked)                                \
  FMA3MA(Name##132PDZ128mbkz, Name##213PDZ128mbkz, Name##231PDZ128mbkz,        \
         X86InstrFMA3Group::X86FMA3KZeroMasked)                                \
  FMA3MA(Name##132PSZ256mbkz, Name##213PSZ256mbkz, Name##231PSZ256mbkz,        \
         X86InstrFMA3Group::X86FMA3KZeroMasked)                                \
  FMA3MA(Name##132PDZ256mbkz, Name##213PDZ256mbkz, Name##231PDZ256mbkz,        \
         X86InstrFMA3Group::X86FMA3KZeroMasked)                                \
  FMA3MA(Name##132PSZmbkz, Name##213PSZmbkz, Name##231PSZmbkz,                 \
         X86InstrFMA3Group::X86FMA3KZeroMasked)                                \
  FMA3MA(Name##132PDZmbkz, Name##213PDZmbkz, Name##231PDZmbkz,                 \
         X86InstrFMA3Group::X86FMA3KZeroMasked)

#define FMA3_AVX512_SCALAR_GROUP(Name)                                         \
  FMA3RM(Name##132SSZr,      Name##213SSZr,     Name##231SSZr,                 \
         Name##132SSZm,      Name##213SSZm,     Name##231SSZm)                 \
  FMA3RM(Name##132SDZr,      Name##213SDZr,     Name##231SDZr,                 \
         Name##132SDZm,      Name##213SDZm,     Name##231SDZm)                 \
  FMA3RMA(Name##132SSZr_Int, Name##213SSZr_Int, Name##231SSZr_Int,             \
          Name##132SSZm_Int, Name##213SSZm_Int, Name##231SSZm_Int,             \
          X86InstrFMA3Group::X86FMA3Intrinsic)                                 \
  FMA3RMA(Name##132SDZr_Int, Name##213SDZr_Int, Name##231SDZr_Int,             \
          Name##132SDZm_Int, Name##213SDZm_Int, Name##231SDZm_Int,             \
          X86InstrFMA3Group::X86FMA3Intrinsic)                                 \
  FMA3RMA(Name##132SSZr_Intk, Name##213SSZr_Intk, Name##231SSZr_Intk,          \
          Name##132SSZm_Intk, Name##213SSZm_Intk, Name##231SSZm_Intk,          \
          X86InstrFMA3Group::X86FMA3Intrinsic |                                \
              X86InstrFMA3Group::X86FMA3KMergeMasked)                          \
  FMA3RMA(Name##132SDZr_Intk, Name##213SDZr_Intk, Name##231SDZr_Intk,          \
          Name##132SDZm_Intk, Name##213SDZm_Intk, Name##231SDZm_Intk,          \
          X86InstrFMA3Group::X86FMA3Intrinsic |                                \
              X86InstrFMA3Group::X86FMA3KMergeMasked)                          \
  FMA3RMA(Name##132SSZr_Intkz, Name##213SSZr_Intkz, Name##231SSZr_Intkz,       \
          Name##132SSZm_Intkz, Name##213SSZm_Intkz, Name##231SSZm_Intkz,       \
          X86InstrFMA3Group::X86FMA3Intrinsic |                                \
              X86InstrFMA3Group::X86FMA3KZeroMasked)                           \
  FMA3RMA(Name##132SDZr_Intkz, Name##213SDZr_Intkz, Name##231SDZr_Intkz,       \
          Name##132SDZm_Intkz, Name##213SDZm_Intkz, Name##231SDZm_Intkz,       \
          X86InstrFMA3Group::X86FMA3Intrinsic |                                \
              X86InstrFMA3Group::X86FMA3KZeroMasked)                           \
  FMA3RA(Name##132SSZrb_Int, Name##213SSZrb_Int, Name##231SSZrb_Int,           \
         X86InstrFMA3Group::X86FMA3Intrinsic)                                  \
  FMA3RA(Name##132SDZrb_Int, Name##213SDZrb_Int, Name##231SDZrb_Int,           \
         X86InstrFMA3Group::X86FMA3Intrinsic)                                  \
  FMA3RA(Name##132SSZrb_Intk, Name##213SSZrb_Intk, Name##231SSZrb_Intk,        \
         X86InstrFMA3Group::X86FMA3Intrinsic |                                 \
             X86InstrFMA3Group::X86FMA3KMergeMasked)                           \
  FMA3RA(Name##132SDZrb_Intk, Name##213SDZrb_Intk, Name##231SDZrb_Intk,        \
         X86InstrFMA3Group::X86FMA3Intrinsic |                                 \
             X86InstrFMA3Group::X86FMA3KMergeMasked)                           \
  FMA3RA(Name##132SSZrb_Intkz, Name##213SSZrb_Intkz, Name##231SSZrb_Intkz,     \
         X86InstrFMA3Group::X86FMA3Intrinsic |                                 \
             X86InstrFMA3Group::X86FMA3KZeroMasked)                            \
  FMA3RA(Name##132SDZrb_Intkz, Name##213SDZrb_Intkz, Name##231SDZrb_Intkz,     \
         X86InstrFMA3Group::X86FMA3Intrinsic |                                 \
             X86InstrFMA3Group::X86FMA3KZeroMasked)

#define FMA3_AVX512_FULL_GROUP(Name)                                           \
  FMA3_AVX512_VECTOR_GROUP(Name)                                               \
  FMA3_AVX512_SCALAR_GROUP(Name)

static const X86InstrFMA3Group Groups[] = {
  FMA3_AVX2_FULL_GROUP(VFMADD)
  FMA3_AVX2_FULL_GROUP(VFMSUB)
  FMA3_AVX2_FULL_GROUP(VFNMADD)
  FMA3_AVX2_FULL_GROUP(VFNMSUB)

  FMA3_AVX2_VECTOR_GROUP(VFMADDSUB)
  FMA3_AVX2_VECTOR_GROUP(VFMSUBADD)

  FMA3_AVX512_FULL_GROUP(VFMADD)
  FMA3_AVX512_FULL_GROUP(VFMSUB)
  FMA3_AVX512_FULL_GROUP(VFNMADD)
  FMA3_AVX512_FULL_GROUP(VFNMSUB)

  FMA3_AVX512_VECTOR_GROUP(VFMADDSUB)
  FMA3_AVX512_VECTOR_GROUP(VFMSUBADD)
};

X86InstrFMA3Info::X86InstrFMA3Info() {
  for (const X86InstrFMA3Group &G : Groups) {
    if (G.RegOpcodes[0])
      OpcodeToGroup[G.RegOpcodes[0]] = &G;
    if (G.RegOpcodes[1])
      OpcodeToGroup[G.RegOpcodes[1]] = &G;
    if (G.RegOpcodes[2])
      OpcodeToGroup[G.RegOpcodes[2]] = &G;
    if (G.MemOpcodes[0])
      OpcodeToGroup[G.MemOpcodes[0]] = &G;
    if (G.MemOpcodes[1])
      OpcodeToGroup[G.MemOpcodes[1]] = &G;
    if (G.MemOpcodes[2])
      OpcodeToGroup[G.MemOpcodes[2]] = &G;
  }
}
OpenPOWER on IntegriCloud