xref: /freebsd/contrib/llvm-project/llvm/lib/Target/X86/X86InstrFoldTables.h (revision dab59af3bcc7cb7ba01569d3044894b3e860ad56)
1 //===-- X86InstrFoldTables.h - X86 Instruction Folding Tables ---*- 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 interface to query the X86 memory folding tables.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_LIB_TARGET_X86_X86INSTRFOLDTABLES_H
14 #define LLVM_LIB_TARGET_X86_X86INSTRFOLDTABLES_H
15 
16 #include <cstdint>
17 #include "llvm/Support/X86FoldTablesUtils.h"
18 
19 namespace llvm {
20 
21 // This struct is used for both the folding and unfold tables. They KeyOp
22 // is used to determine the sorting order.
23 struct X86FoldTableEntry {
24   unsigned KeyOp;
25   unsigned DstOp;
26   uint16_t Flags;
27 
28   bool operator<(const X86FoldTableEntry &RHS) const {
29     return KeyOp < RHS.KeyOp;
30   }
31   bool operator==(const X86FoldTableEntry &RHS) const {
32     return KeyOp == RHS.KeyOp;
33   }
34   friend bool operator<(const X86FoldTableEntry &TE, unsigned Opcode) {
35     return TE.KeyOp < Opcode;
36   }
37 };
38 
39 // Look up the memory folding table entry for folding a load and a store into
40 // operand 0.
41 const X86FoldTableEntry *lookupTwoAddrFoldTable(unsigned RegOp);
42 
43 // Look up the memory folding table entry for folding a load or store with
44 // operand OpNum.
45 const X86FoldTableEntry *lookupFoldTable(unsigned RegOp, unsigned OpNum);
46 
47 // Look up the broadcast folding table entry for folding a broadcast with
48 // operand OpNum.
49 const X86FoldTableEntry *lookupBroadcastFoldTable(unsigned RegOp,
50                                                   unsigned OpNum);
51 
52 // Look up the memory unfolding table entry for this instruction.
53 const X86FoldTableEntry *lookupUnfoldTable(unsigned MemOp);
54 
55 // Look up the broadcast folding table entry for this instruction from
56 // the regular memory instruction.
57 const X86FoldTableEntry *lookupBroadcastFoldTableBySize(unsigned MemOp,
58                                                         unsigned BroadcastBits);
59 
60 bool matchBroadcastSize(const X86FoldTableEntry &Entry, unsigned BroadcastBits);
61 } // namespace llvm
62 
63 #endif
64