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