123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- //===-- PPCInstrHTM.td - The PowerPC Hardware Transactional Memory -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file describes the Hardware Transactional Memory extension to the
- // PowerPC instruction set.
- //
- //===----------------------------------------------------------------------===//
- def HasHTM : Predicate<"Subtarget->hasHTM()">;
- def HTM_get_imm : SDNodeXForm<imm, [{
- return getI32Imm (N->getZExtValue(), SDLoc(N));
- }]>;
- let hasSideEffects = 1 in {
- def TCHECK_RET : PPCCustomInserterPseudo<(outs gprc:$out), (ins), "#TCHECK_RET", []>;
- def TBEGIN_RET : PPCCustomInserterPseudo<(outs gprc:$out), (ins u1imm:$R), "#TBEGIN_RET", []>;
- }
- let Predicates = [HasHTM] in {
- let Defs = [CR0] in {
- def TBEGIN : XForm_htm0 <31, 654,
- (outs), (ins u1imm:$R), "tbegin. $R", IIC_SprMTSPR>;
- def TEND : XForm_htm1 <31, 686,
- (outs), (ins u1imm:$A), "tend. $A", IIC_SprMTSPR>;
- def TABORT : XForm_base_r3xo <31, 910,
- (outs), (ins gprc:$A), "tabort. $A", IIC_SprMTSPR,
- []>, isRecordForm {
- let RST = 0;
- let B = 0;
- }
- def TABORTWC : XForm_base_r3xo <31, 782,
- (outs), (ins u5imm:$RTS, gprc:$A, gprc:$B),
- "tabortwc. $RTS, $A, $B", IIC_SprMTSPR, []>,
- isRecordForm;
- def TABORTWCI : XForm_base_r3xo <31, 846,
- (outs), (ins u5imm:$RTS, gprc:$A, u5imm:$B),
- "tabortwci. $RTS, $A, $B", IIC_SprMTSPR, []>,
- isRecordForm;
- def TABORTDC : XForm_base_r3xo <31, 814,
- (outs), (ins u5imm:$RTS, gprc:$A, gprc:$B),
- "tabortdc. $RTS, $A, $B", IIC_SprMTSPR, []>,
- isRecordForm;
- def TABORTDCI : XForm_base_r3xo <31, 878,
- (outs), (ins u5imm:$RTS, gprc:$A, u5imm:$B),
- "tabortdci. $RTS, $A, $B", IIC_SprMTSPR, []>,
- isRecordForm;
- def TSR : XForm_htm2 <31, 750,
- (outs), (ins u1imm:$L), "tsr. $L", IIC_SprMTSPR>,
- isRecordForm;
- def TRECLAIM : XForm_base_r3xo <31, 942,
- (outs), (ins gprc:$A), "treclaim. $A",
- IIC_SprMTSPR, []>,
- isRecordForm {
- let RST = 0;
- let B = 0;
- }
- def TRECHKPT : XForm_base_r3xo <31, 1006,
- (outs), (ins), "trechkpt.", IIC_SprMTSPR, []>,
- isRecordForm {
- let RST = 0;
- let A = 0;
- let B = 0;
- }
- }
- def TCHECK : XForm_htm3 <31, 718,
- (outs crrc:$BF), (ins), "tcheck $BF", IIC_SprMTSPR>;
- // Builtins
- // All HTM instructions, with the exception of tcheck, set CR0 with the
- // value of the MSR Transaction State (TS) bits that exist before the
- // instruction is executed. For tbegin., the EQ bit in CR0 can be used
- // to determine whether the transaction was successfully started (0) or
- // failed (1). We use an XORI pattern to 'flip' the bit to match the
- // tbegin builtin API which defines a return value of 1 as success.
- def : Pat<(int_ppc_tbegin i32:$R),
- (XORI (TBEGIN_RET(HTM_get_imm imm:$R)), 1)>;
- def : Pat<(int_ppc_tend i32:$R),
- (TEND (HTM_get_imm imm:$R))>;
- def : Pat<(int_ppc_tabort i32:$R),
- (TABORT $R)>;
- def : Pat<(int_ppc_tabortwc i32:$TO, i32:$RA, i32:$RB),
- (TABORTWC (HTM_get_imm imm:$TO), $RA, $RB)>;
- def : Pat<(int_ppc_tabortwci i32:$TO, i32:$RA, i32:$SI),
- (TABORTWCI (HTM_get_imm imm:$TO), $RA, (HTM_get_imm imm:$SI))>;
- def : Pat<(int_ppc_tabortdc i32:$TO, i32:$RA, i32:$RB),
- (TABORTDC (HTM_get_imm imm:$TO), $RA, $RB)>;
- def : Pat<(int_ppc_tabortdci i32:$TO, i32:$RA, i32:$SI),
- (TABORTDCI (HTM_get_imm imm:$TO), $RA, (HTM_get_imm imm:$SI))>;
- def : Pat<(int_ppc_tcheck),
- (TCHECK_RET)>;
- def : Pat<(int_ppc_treclaim i32:$RA),
- (TRECLAIM $RA)>;
- def : Pat<(int_ppc_trechkpt),
- (TRECHKPT)>;
- def : Pat<(int_ppc_tsr i32:$L),
- (TSR (HTM_get_imm imm:$L))>;
- def : Pat<(int_ppc_get_texasr),
- (MFSPR8 130)>;
- def : Pat<(int_ppc_get_texasru),
- (MFSPR8 131)>;
- def : Pat<(int_ppc_get_tfhar),
- (MFSPR8 128)>;
- def : Pat<(int_ppc_get_tfiar),
- (MFSPR8 129)>;
- def : Pat<(int_ppc_set_texasr i64:$V),
- (MTSPR8 130, $V)>;
- def : Pat<(int_ppc_set_texasru i64:$V),
- (MTSPR8 131, $V)>;
- def : Pat<(int_ppc_set_tfhar i64:$V),
- (MTSPR8 128, $V)>;
- def : Pat<(int_ppc_set_tfiar i64:$V),
- (MTSPR8 129, $V)>;
- // Extended mnemonics
- def : Pat<(int_ppc_tendall),
- (TEND 1)>;
- def : Pat<(int_ppc_tresume),
- (TSR 1)>;
- def : Pat<(int_ppc_tsuspend),
- (TSR 0)>;
- def : Pat<(i64 (int_ppc_ttest)),
- (i64 (INSERT_SUBREG
- (i64 (IMPLICIT_DEF)), (TABORTWCI 0, (LI 0), 0), sub_32))>;
- } // [HasHTM]
- def : InstAlias<"tend.", (TEND 0)>, Requires<[HasHTM]>;
- def : InstAlias<"tendall.", (TEND 1)>, Requires<[HasHTM]>;
- def : InstAlias<"tsuspend.", (TSR 0)>, Requires<[HasHTM]>;
- def : InstAlias<"tresume.", (TSR 1)>, Requires<[HasHTM]>;
|