Add gfx950 mfma instructions to ROCDL dialect (#123361)
[llvm-project.git] / llvm / lib / Target / X86 / X86InstrConditionalCompare.td
blob35af8405f1abe490c5071219f69e72c1b4465c8b
1 //===-- X86InstrConditionalCompare.td - Conditional Compare --*- tablegen -*-==//
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 describes the X86 conditional compare instructions.
11 //===----------------------------------------------------------------------===//
13 class BinCondOp<bits<8> o, Format f, X86TypeInfo t, DAGOperand op1, DAGOperand op2, string m>
14   : ITy<o, f, t, (outs), (ins op1:$src1, op2:$src2, cflags:$dcf, ccode:$cond),
15         m#"${cond}", "$dcf\t{$src2, $src1|$src1, $src2}" , []>, T_MAP4, EVEX, Requires<[In64BitMode]> {
16   let isCodeGenOnly = 1;
17   let ForceDisassemble = 1;
18   let Uses = [EFLAGS];
19   let Defs = [EFLAGS];
20   let hasTwoConditionalOps = 1;
21   let ImmT = !if(!eq(op2, i16i8imm), Imm8,
22              !if(!eq(op2, i32i8imm), Imm8,
23              !if(!eq(op2, i64i8imm), Imm8,
24              !if(!eq(op2, i8imm), Imm8,
25              !if(!eq(op2, i16imm), Imm16,
26              !if(!eq(op2, i32imm), Imm32,
27              !if(!eq(op2, i64i32imm), Imm32S, NoImm)))))));
30 class Ccmp<bits<8> o, Format f, X86TypeInfo t, DAGOperand op1, DAGOperand op2>:
31   BinCondOp<o, f, t, op1, op2, "ccmp">;
33 class Ctest<bits<8> o, Format f, X86TypeInfo t, DAGOperand op1, DAGOperand op2>:
34   BinCondOp<o, f, t, op1, op2, "ctest">;
36 //===----------------------------------------------------------------------===//
37 // CCMP Instructions
39 let SchedRW = [WriteALU] in {
40   def CCMP8rr : Ccmp<0x38, MRMDestReg, Xi8,  GR8,  GR8>;
41   def CCMP16rr: Ccmp<0x39, MRMDestReg, Xi16, GR16, GR16>, PD;
42   def CCMP32rr: Ccmp<0x39, MRMDestReg, Xi32, GR32, GR32>;
43   def CCMP64rr: Ccmp<0x39, MRMDestReg, Xi64, GR64, GR64>;
44   def CCMP8rr_REV : Ccmp<0x3a, MRMSrcReg, Xi8,  GR8,  GR8>;
45   def CCMP16rr_REV: Ccmp<0x3b, MRMSrcReg, Xi16, GR16, GR16>, PD;
46   def CCMP32rr_REV: Ccmp<0x3b, MRMSrcReg, Xi32, GR32, GR32>;
47   def CCMP64rr_REV: Ccmp<0x3b, MRMSrcReg, Xi64, GR64, GR64>;
48   def CCMP16ri8: Ccmp<0x83, MRM7r, Xi16, GR16, i16i8imm>, PD;
49   def CCMP32ri8: Ccmp<0x83, MRM7r, Xi32, GR32, i32i8imm>;
50   def CCMP64ri8: Ccmp<0x83, MRM7r, Xi64, GR64, i64i8imm>;
52   def CCMP8ri : Ccmp<0x80, MRM7r, Xi8,   GR8, i8imm>;
53   def CCMP16ri: Ccmp<0x81, MRM7r, Xi16, GR16, i16imm>, PD;
54   def CCMP32ri: Ccmp<0x81, MRM7r, Xi32, GR32, i32imm>;
55   def CCMP64ri32: Ccmp<0x81, MRM7r, Xi64, GR64, i64i32imm>;
58 let mayLoad = 1 in {
59   let SchedRW = [WriteALU.Folded] in {
60     def CCMP16mi8: Ccmp<0x83, MRM7m, Xi16, i16mem, i16i8imm>, PD;
61     def CCMP32mi8: Ccmp<0x83, MRM7m, Xi32, i32mem, i32i8imm>;
62     def CCMP64mi8: Ccmp<0x83, MRM7m, Xi64, i64mem, i64i8imm>;
63     def CCMP8mi : Ccmp<0x80, MRM7m, Xi8,   i8mem, i8imm>;
64     def CCMP16mi: Ccmp<0x81, MRM7m, Xi16, i16mem, i16imm>, PD;
65     def CCMP32mi: Ccmp<0x81, MRM7m, Xi32, i32mem, i32imm>;
66     def CCMP64mi32: Ccmp<0x81, MRM7m, Xi64, i64mem, i64i32imm>;
67   }
68   let SchedRW = [WriteALU.Folded, WriteALU.ReadAfterFold] in {
69     def CCMP8rm : Ccmp<0x3a, MRMSrcMem, Xi8,  GR8,  i8mem>;
70     def CCMP16rm: Ccmp<0x3b, MRMSrcMem, Xi16, GR16, i16mem>, PD;
71     def CCMP32rm: Ccmp<0x3b, MRMSrcMem, Xi32, GR32, i32mem>;
72     def CCMP64rm: Ccmp<0x3b, MRMSrcMem, Xi64, GR64, i64mem>;
74     def CCMP8mr : Ccmp<0x38, MRMDestMem, Xi8,  i8mem,  GR8>;
75     def CCMP16mr: Ccmp<0x39, MRMDestMem, Xi16, i16mem, GR16>, PD;
76     def CCMP32mr: Ccmp<0x39, MRMDestMem, Xi32, i32mem, GR32>;
77     def CCMP64mr: Ccmp<0x39, MRMDestMem, Xi64, i64mem, GR64>;
78   }
81 def : Pat<(X86ccmp GR8:$src1, GR8:$src2, timm:$dcf, timm:$cond, EFLAGS),
82           (CCMP8rr GR8:$src1, GR8:$src2, timm:$dcf, timm:$cond)>;
83 def : Pat<(X86ccmp GR16:$src1, GR16:$src2, timm:$dcf, timm:$cond, EFLAGS),
84           (CCMP16rr GR16:$src1, GR16:$src2, timm:$dcf, timm:$cond)>;
85 def : Pat<(X86ccmp GR32:$src1, GR32:$src2, timm:$dcf, timm:$cond, EFLAGS),
86           (CCMP32rr GR32:$src1, GR32:$src2, timm:$dcf, timm:$cond)>;
87 def : Pat<(X86ccmp GR64:$src1, GR64:$src2, timm:$dcf, timm:$cond, EFLAGS),
88           (CCMP64rr GR64:$src1, GR64:$src2, timm:$dcf, timm:$cond)>;
90 def : Pat<(X86ccmp GR8:$src1, (i8 imm:$src2), timm:$dcf, timm:$cond, EFLAGS),
91           (CCMP8ri GR8:$src1, imm:$src2, timm:$dcf, timm:$cond)>;
92 def : Pat<(X86ccmp GR16:$src1, (i16 imm:$src2), timm:$dcf, timm:$cond, EFLAGS),
93           (CCMP16ri GR16:$src1, imm:$src2, timm:$dcf, timm:$cond)>;
94 def : Pat<(X86ccmp GR32:$src1, (i32 imm:$src2), timm:$dcf, timm:$cond, EFLAGS),
95           (CCMP32ri GR32:$src1, imm:$src2, timm:$dcf, timm:$cond)>;
96 def : Pat<(X86ccmp GR64:$src1, i64immSExt32_su:$src2, timm:$dcf, timm:$cond, EFLAGS),
97           (CCMP64ri32 GR64:$src1, i64immSExt32_su:$src2, timm:$dcf, timm:$cond)>;
99 def : Pat<(X86ccmp GR8:$src1, (loadi8 addr:$src2), timm:$dcf, timm:$cond, EFLAGS),
100           (CCMP8rm GR8:$src1, addr:$src2, timm:$dcf, timm:$cond)>;
101 def : Pat<(X86ccmp GR16:$src1, (loadi16 addr:$src2), timm:$dcf, timm:$cond, EFLAGS),
102           (CCMP16rm GR16:$src1, addr:$src2, timm:$dcf, timm:$cond)>;
103 def : Pat<(X86ccmp GR32:$src1, (loadi32 addr:$src2), timm:$dcf, timm:$cond, EFLAGS),
104           (CCMP32rm GR32:$src1, addr:$src2, timm:$dcf, timm:$cond)>;
105 def : Pat<(X86ccmp GR64:$src1, (loadi64 addr:$src2), timm:$dcf, timm:$cond, EFLAGS),
106           (CCMP64rm GR64:$src1, addr:$src2, timm:$dcf, timm:$cond)>;
109 //===----------------------------------------------------------------------===//
110 // CTEST Instructions
112 let SchedRW = [WriteALU] in {
113   let isCommutable = 1 in {
114     def CTEST8rr : Ctest<0x84, MRMDestReg, Xi8,  GR8,  GR8>;
115     def CTEST16rr: Ctest<0x85, MRMDestReg, Xi16, GR16, GR16>, PD;
116     def CTEST32rr: Ctest<0x85, MRMDestReg, Xi32, GR32, GR32>;
117     def CTEST64rr: Ctest<0x85, MRMDestReg, Xi64, GR64, GR64>;
118   }
119   def CTEST8ri : Ctest<0xF6, MRM0r, Xi8,   GR8, i8imm>;
120   def CTEST16ri: Ctest<0xF7, MRM0r, Xi16, GR16, i16imm>, PD;
121   def CTEST32ri: Ctest<0xF7, MRM0r, Xi32, GR32, i32imm>;
122   def CTEST64ri32: Ctest<0xF7, MRM0r, Xi64, GR64, i64i32imm>;
125 let mayLoad = 1 in {
126   let SchedRW = [WriteALU.Folded] in {
127     def CTEST8mi : Ctest<0xF6, MRM0m, Xi8,   i8mem, i8imm>;
128     def CTEST16mi: Ctest<0xF7, MRM0m, Xi16, i16mem, i16imm>, PD;
129     def CTEST32mi: Ctest<0xF7, MRM0m, Xi32, i32mem, i32imm>;
130     def CTEST64mi32: Ctest<0xF7, MRM0m, Xi64, i64mem, i64i32imm>;
131   }
132   let SchedRW = [WriteALU.Folded, WriteALU.ReadAfterFold] in {
133     def CTEST8mr : Ctest<0x84, MRMDestMem, Xi8,  i8mem,  GR8>;
134     def CTEST16mr: Ctest<0x85, MRMDestMem, Xi16, i16mem, GR16>, PD;
135     def CTEST32mr: Ctest<0x85, MRMDestMem, Xi32, i32mem, GR32>;
136     def CTEST64mr: Ctest<0x85, MRMDestMem, Xi64, i64mem, GR64>;
137   }
140 def : Pat<(X86ctest GR8:$src1, GR8:$src2, timm:$dcf, timm:$cond, EFLAGS),
141           (CTEST8rr GR8:$src1, GR8:$src2, timm:$dcf, timm:$cond)>;
142 def : Pat<(X86ctest GR16:$src1, GR16:$src2, timm:$dcf, timm:$cond, EFLAGS),
143           (CTEST16rr GR16:$src1, GR16:$src2, timm:$dcf, timm:$cond)>;
144 def : Pat<(X86ctest GR32:$src1, GR32:$src2, timm:$dcf, timm:$cond, EFLAGS),
145           (CTEST32rr GR32:$src1, GR32:$src2, timm:$dcf, timm:$cond)>;
146 def : Pat<(X86ctest GR64:$src1, GR64:$src2, timm:$dcf, timm:$cond, EFLAGS),
147           (CTEST64rr GR64:$src1, GR64:$src2, timm:$dcf, timm:$cond)>;
149 def : Pat<(X86ctestpat GR8:$src1, imm:$src2, timm:$dcf, timm:$cond),
150           (CTEST8ri GR8:$src1, imm:$src2, timm:$dcf, timm:$cond)>;
151 def : Pat<(X86ctestpat GR16:$src1, imm:$src2, timm:$dcf, timm:$cond),
152           (CTEST16ri GR16:$src1, imm:$src2, timm:$dcf, timm:$cond)>;
153 def : Pat<(X86ctestpat GR32:$src1, imm:$src2, timm:$dcf, timm:$cond),
154           (CTEST32ri GR32:$src1, imm:$src2, timm:$dcf, timm:$cond)>;
155 def : Pat<(X86ctestpat GR64:$src1, i64immSExt32_su:$src2, timm:$dcf, timm:$cond),
156           (CTEST64ri32 GR64:$src1, i64immSExt32_su:$src2, timm:$dcf, timm:$cond)>;