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