xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCInstrHTM.td (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric//===-- PPCInstrHTM.td - The PowerPC Hardware Transactional Memory  -*-===//
2*0b57cec5SDimitry Andric//
3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric//
7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric//
9*0b57cec5SDimitry Andric// This file describes the Hardware Transactional Memory extension to the
10*0b57cec5SDimitry Andric// PowerPC instruction set.
11*0b57cec5SDimitry Andric//
12*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
13*0b57cec5SDimitry Andric
14*0b57cec5SDimitry Andric
15*0b57cec5SDimitry Andric
16*0b57cec5SDimitry Andricdef HasHTM : Predicate<"PPCSubTarget->hasHTM()">;
17*0b57cec5SDimitry Andric
18*0b57cec5SDimitry Andricdef HTM_get_imm : SDNodeXForm<imm, [{
19*0b57cec5SDimitry Andric  return getI32Imm (N->getZExtValue(), SDLoc(N));
20*0b57cec5SDimitry Andric}]>;
21*0b57cec5SDimitry Andric
22*0b57cec5SDimitry Andriclet hasSideEffects = 1 in {
23*0b57cec5SDimitry Andricdef TCHECK_RET : PPCCustomInserterPseudo<(outs gprc:$out), (ins), "#TCHECK_RET", []>;
24*0b57cec5SDimitry Andricdef TBEGIN_RET : PPCCustomInserterPseudo<(outs gprc:$out), (ins u1imm:$R), "#TBEGIN_RET", []>;
25*0b57cec5SDimitry Andric}
26*0b57cec5SDimitry Andric
27*0b57cec5SDimitry Andric
28*0b57cec5SDimitry Andriclet Predicates = [HasHTM] in {
29*0b57cec5SDimitry Andric
30*0b57cec5SDimitry Andriclet Defs = [CR0] in {
31*0b57cec5SDimitry Andricdef TBEGIN : XForm_htm0 <31, 654,
32*0b57cec5SDimitry Andric                         (outs), (ins u1imm:$R), "tbegin. $R", IIC_SprMTSPR, []>;
33*0b57cec5SDimitry Andric
34*0b57cec5SDimitry Andricdef TEND : XForm_htm1 <31, 686,
35*0b57cec5SDimitry Andric                       (outs), (ins u1imm:$A), "tend. $A", IIC_SprMTSPR, []>;
36*0b57cec5SDimitry Andric
37*0b57cec5SDimitry Andricdef TABORT : XForm_base_r3xo <31, 910,
38*0b57cec5SDimitry Andric                              (outs), (ins gprc:$A), "tabort. $A", IIC_SprMTSPR,
39*0b57cec5SDimitry Andric                              []>, isDOT {
40*0b57cec5SDimitry Andric  let RST = 0;
41*0b57cec5SDimitry Andric  let B = 0;
42*0b57cec5SDimitry Andric}
43*0b57cec5SDimitry Andric
44*0b57cec5SDimitry Andricdef TABORTWC : XForm_base_r3xo <31, 782,
45*0b57cec5SDimitry Andric                                (outs), (ins u5imm:$RTS, gprc:$A, gprc:$B),
46*0b57cec5SDimitry Andric                                "tabortwc. $RTS, $A, $B", IIC_SprMTSPR, []>,
47*0b57cec5SDimitry Andric                                isDOT;
48*0b57cec5SDimitry Andric
49*0b57cec5SDimitry Andricdef TABORTWCI : XForm_base_r3xo <31, 846,
50*0b57cec5SDimitry Andric                                 (outs), (ins u5imm:$RTS, gprc:$A, u5imm:$B),
51*0b57cec5SDimitry Andric                                 "tabortwci. $RTS, $A, $B", IIC_SprMTSPR, []>,
52*0b57cec5SDimitry Andric                                 isDOT;
53*0b57cec5SDimitry Andric
54*0b57cec5SDimitry Andricdef TABORTDC : XForm_base_r3xo <31, 814,
55*0b57cec5SDimitry Andric                                (outs), (ins u5imm:$RTS, gprc:$A, gprc:$B),
56*0b57cec5SDimitry Andric                                "tabortdc. $RTS, $A, $B", IIC_SprMTSPR, []>,
57*0b57cec5SDimitry Andric                                isDOT;
58*0b57cec5SDimitry Andric
59*0b57cec5SDimitry Andricdef TABORTDCI : XForm_base_r3xo <31, 878,
60*0b57cec5SDimitry Andric                                 (outs), (ins u5imm:$RTS, gprc:$A, u5imm:$B),
61*0b57cec5SDimitry Andric                                 "tabortdci. $RTS, $A, $B", IIC_SprMTSPR, []>,
62*0b57cec5SDimitry Andric                                 isDOT;
63*0b57cec5SDimitry Andric
64*0b57cec5SDimitry Andricdef TSR : XForm_htm2 <31, 750,
65*0b57cec5SDimitry Andric                      (outs), (ins u1imm:$L), "tsr. $L", IIC_SprMTSPR, []>,
66*0b57cec5SDimitry Andric                      isDOT;
67*0b57cec5SDimitry Andric
68*0b57cec5SDimitry Andricdef TRECLAIM : XForm_base_r3xo <31, 942,
69*0b57cec5SDimitry Andric                                (outs), (ins gprc:$A), "treclaim. $A",
70*0b57cec5SDimitry Andric                                IIC_SprMTSPR, []>,
71*0b57cec5SDimitry Andric                                isDOT {
72*0b57cec5SDimitry Andric  let RST = 0;
73*0b57cec5SDimitry Andric  let B = 0;
74*0b57cec5SDimitry Andric}
75*0b57cec5SDimitry Andric
76*0b57cec5SDimitry Andricdef TRECHKPT : XForm_base_r3xo <31, 1006,
77*0b57cec5SDimitry Andric                                (outs), (ins), "trechkpt.", IIC_SprMTSPR, []>,
78*0b57cec5SDimitry Andric                                isDOT {
79*0b57cec5SDimitry Andric  let RST = 0;
80*0b57cec5SDimitry Andric  let A = 0;
81*0b57cec5SDimitry Andric  let B = 0;
82*0b57cec5SDimitry Andric}
83*0b57cec5SDimitry Andric
84*0b57cec5SDimitry Andric}
85*0b57cec5SDimitry Andric
86*0b57cec5SDimitry Andricdef TCHECK : XForm_htm3 <31, 718,
87*0b57cec5SDimitry Andric                        (outs crrc:$BF), (ins), "tcheck $BF", IIC_SprMTSPR, []>;
88*0b57cec5SDimitry Andric// Builtins
89*0b57cec5SDimitry Andric
90*0b57cec5SDimitry Andric// All HTM instructions, with the exception of tcheck, set CR0 with the
91*0b57cec5SDimitry Andric// value of the MSR Transaction State (TS) bits that exist before the
92*0b57cec5SDimitry Andric// instruction is executed.  For tbegin., the EQ bit in CR0 can be used
93*0b57cec5SDimitry Andric// to determine whether the transaction was successfully started (0) or
94*0b57cec5SDimitry Andric// failed (1).  We use an XORI pattern to 'flip' the bit to match the
95*0b57cec5SDimitry Andric// tbegin builtin API which defines a return value of 1 as success.
96*0b57cec5SDimitry Andric
97*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tbegin i32:$R),
98*0b57cec5SDimitry Andric           (XORI (TBEGIN_RET(HTM_get_imm imm:$R)), 1)>;
99*0b57cec5SDimitry Andric
100*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tend i32:$R),
101*0b57cec5SDimitry Andric          (TEND (HTM_get_imm imm:$R))>;
102*0b57cec5SDimitry Andric
103*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tabort i32:$R),
104*0b57cec5SDimitry Andric          (TABORT $R)>;
105*0b57cec5SDimitry Andric
106*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tabortwc i32:$TO, i32:$RA, i32:$RB),
107*0b57cec5SDimitry Andric          (TABORTWC (HTM_get_imm imm:$TO), $RA, $RB)>;
108*0b57cec5SDimitry Andric
109*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tabortwci i32:$TO, i32:$RA, i32:$SI),
110*0b57cec5SDimitry Andric          (TABORTWCI (HTM_get_imm imm:$TO), $RA, (HTM_get_imm imm:$SI))>;
111*0b57cec5SDimitry Andric
112*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tabortdc i32:$TO, i32:$RA, i32:$RB),
113*0b57cec5SDimitry Andric          (TABORTDC (HTM_get_imm imm:$TO), $RA, $RB)>;
114*0b57cec5SDimitry Andric
115*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tabortdci i32:$TO, i32:$RA, i32:$SI),
116*0b57cec5SDimitry Andric          (TABORTDCI (HTM_get_imm imm:$TO), $RA, (HTM_get_imm imm:$SI))>;
117*0b57cec5SDimitry Andric
118*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tcheck),
119*0b57cec5SDimitry Andric          (TCHECK_RET)>;
120*0b57cec5SDimitry Andric
121*0b57cec5SDimitry Andricdef : Pat<(int_ppc_treclaim i32:$RA),
122*0b57cec5SDimitry Andric          (TRECLAIM $RA)>;
123*0b57cec5SDimitry Andric
124*0b57cec5SDimitry Andricdef : Pat<(int_ppc_trechkpt),
125*0b57cec5SDimitry Andric          (TRECHKPT)>;
126*0b57cec5SDimitry Andric
127*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tsr i32:$L),
128*0b57cec5SDimitry Andric          (TSR (HTM_get_imm imm:$L))>;
129*0b57cec5SDimitry Andric
130*0b57cec5SDimitry Andricdef : Pat<(int_ppc_get_texasr),
131*0b57cec5SDimitry Andric          (MFSPR8 130)>;
132*0b57cec5SDimitry Andric
133*0b57cec5SDimitry Andricdef : Pat<(int_ppc_get_texasru),
134*0b57cec5SDimitry Andric          (MFSPR8 131)>;
135*0b57cec5SDimitry Andric
136*0b57cec5SDimitry Andricdef : Pat<(int_ppc_get_tfhar),
137*0b57cec5SDimitry Andric          (MFSPR8 128)>;
138*0b57cec5SDimitry Andric
139*0b57cec5SDimitry Andricdef : Pat<(int_ppc_get_tfiar),
140*0b57cec5SDimitry Andric          (MFSPR8 129)>;
141*0b57cec5SDimitry Andric
142*0b57cec5SDimitry Andric
143*0b57cec5SDimitry Andricdef : Pat<(int_ppc_set_texasr i64:$V),
144*0b57cec5SDimitry Andric          (MTSPR8 130, $V)>;
145*0b57cec5SDimitry Andric
146*0b57cec5SDimitry Andricdef : Pat<(int_ppc_set_texasru i64:$V),
147*0b57cec5SDimitry Andric          (MTSPR8 131, $V)>;
148*0b57cec5SDimitry Andric
149*0b57cec5SDimitry Andricdef : Pat<(int_ppc_set_tfhar i64:$V),
150*0b57cec5SDimitry Andric          (MTSPR8 128, $V)>;
151*0b57cec5SDimitry Andric
152*0b57cec5SDimitry Andricdef : Pat<(int_ppc_set_tfiar i64:$V),
153*0b57cec5SDimitry Andric          (MTSPR8 129, $V)>;
154*0b57cec5SDimitry Andric
155*0b57cec5SDimitry Andric
156*0b57cec5SDimitry Andric// Extended mnemonics
157*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tendall),
158*0b57cec5SDimitry Andric          (TEND 1)>;
159*0b57cec5SDimitry Andric
160*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tresume),
161*0b57cec5SDimitry Andric          (TSR 1)>;
162*0b57cec5SDimitry Andric
163*0b57cec5SDimitry Andricdef : Pat<(int_ppc_tsuspend),
164*0b57cec5SDimitry Andric          (TSR 0)>;
165*0b57cec5SDimitry Andric
166*0b57cec5SDimitry Andricdef : Pat<(i64 (int_ppc_ttest)),
167*0b57cec5SDimitry Andric          (RLDICL (i64 (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
168*0b57cec5SDimitry Andric                                      (TABORTWCI 0, (LI 0), 0), sub_32)),
169*0b57cec5SDimitry Andric                   36, 28)>;
170*0b57cec5SDimitry Andric
171*0b57cec5SDimitry Andric} // [HasHTM]
172