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