1*9880d681SAndroid Build Coastguard Worker//===- MipsEVAInstrInfo.td - EVA ASE instructions -*- tablegen ------------*-=// 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 Mips EVA ASE instructions. 11*9880d681SAndroid Build Coastguard Worker// 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// Instruction encodings 17*9880d681SAndroid Build Coastguard Worker// 18*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker// Memory Load/Store EVA encodings 21*9880d681SAndroid Build Coastguard Workerclass LBE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LBE>; 22*9880d681SAndroid Build Coastguard Workerclass LBuE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LBuE>; 23*9880d681SAndroid Build Coastguard Workerclass LHE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LHE>; 24*9880d681SAndroid Build Coastguard Workerclass LHuE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LHuE>; 25*9880d681SAndroid Build Coastguard Workerclass LWE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWE>; 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerclass SBE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SBE>; 28*9880d681SAndroid Build Coastguard Workerclass SHE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SHE>; 29*9880d681SAndroid Build Coastguard Workerclass SWE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWE>; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker// load/store left/right EVA encodings 32*9880d681SAndroid Build Coastguard Workerclass LWLE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWLE>; 33*9880d681SAndroid Build Coastguard Workerclass LWRE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWRE>; 34*9880d681SAndroid Build Coastguard Workerclass SWLE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWLE>; 35*9880d681SAndroid Build Coastguard Workerclass SWRE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWRE>; 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker// Load-linked EVA, Store-conditional EVA encodings 38*9880d681SAndroid Build Coastguard Workerclass LLE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LLE>; 39*9880d681SAndroid Build Coastguard Workerclass SCE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SCE>; 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerclass TLBINV_ENC : TLB_FM<OPCODE6_TLBINV>; 42*9880d681SAndroid Build Coastguard Workerclass TLBINVF_ENC : TLB_FM<OPCODE6_TLBINVF>; 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerclass CACHEE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_CACHEE>; 45*9880d681SAndroid Build Coastguard Workerclass PREFE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_PREFE>; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 48*9880d681SAndroid Build Coastguard Worker// 49*9880d681SAndroid Build Coastguard Worker// Instruction descriptions 50*9880d681SAndroid Build Coastguard Worker// 51*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker// Memory Load/Store EVA descriptions 54*9880d681SAndroid Build Coastguard Workerclass LOAD_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 55*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> { 56*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rt); 57*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins mem_simm9:$addr); 58*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 59*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 60*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemEVA"; 61*9880d681SAndroid Build Coastguard Worker bit canFoldAsLoad = 1; 62*9880d681SAndroid Build Coastguard Worker bit mayLoad = 1; 63*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerclass LBE_DESC : LOAD_EVA_DESC_BASE<"lbe", GPR32Opnd, II_LBE>; 67*9880d681SAndroid Build Coastguard Workerclass LBuE_DESC : LOAD_EVA_DESC_BASE<"lbue", GPR32Opnd, II_LBUE>; 68*9880d681SAndroid Build Coastguard Workerclass LHE_DESC : LOAD_EVA_DESC_BASE<"lhe", GPR32Opnd, II_LHE>; 69*9880d681SAndroid Build Coastguard Workerclass LHuE_DESC : LOAD_EVA_DESC_BASE<"lhue", GPR32Opnd, II_LHUE>; 70*9880d681SAndroid Build Coastguard Workerclass LWE_DESC : LOAD_EVA_DESC_BASE<"lwe", GPR32Opnd, II_LWE>; 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerclass STORE_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 73*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag, 74*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> { 75*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 76*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr); 77*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 78*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 79*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemEVA"; 80*9880d681SAndroid Build Coastguard Worker bit mayStore = 1; 81*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerclass SBE_DESC : STORE_EVA_DESC_BASE<"sbe", GPR32Opnd, null_frag, II_SBE>; 85*9880d681SAndroid Build Coastguard Workerclass SHE_DESC : STORE_EVA_DESC_BASE<"she", GPR32Opnd, null_frag, II_SHE>; 86*9880d681SAndroid Build Coastguard Workerclass SWE_DESC : STORE_EVA_DESC_BASE<"swe", GPR32Opnd, null_frag, II_SWE>; 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker// Load/Store Left/Right EVA descriptions 89*9880d681SAndroid Build Coastguard Workerclass LOAD_LEFT_RIGHT_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 90*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> { 91*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rt); 92*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins mem_simm9:$addr, GPROpnd:$src); 93*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 94*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 95*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemEVA"; 96*9880d681SAndroid Build Coastguard Worker string Constraints = "$src = $rt"; 97*9880d681SAndroid Build Coastguard Worker bit canFoldAsLoad = 1; 98*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerclass LWLE_DESC : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"lwle", GPR32Opnd, II_LWLE>; 102*9880d681SAndroid Build Coastguard Workerclass LWRE_DESC : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"lwre", GPR32Opnd, II_LWRE>; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerclass STORE_LEFT_RIGHT_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 105*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> { 106*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 107*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr); 108*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 109*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 110*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemEVA"; 111*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerclass SWLE_DESC : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"swle", GPR32Opnd, II_SWLE>; 115*9880d681SAndroid Build Coastguard Workerclass SWRE_DESC : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"swre", GPR32Opnd, II_SWRE>; 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker// Load-linked EVA, Store-conditional EVA descriptions 118*9880d681SAndroid Build Coastguard Workerclass LLE_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 119*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> { 120*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$rt); 121*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins mem_simm9:$addr); 122*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 123*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 124*9880d681SAndroid Build Coastguard Worker bit mayLoad = 1; 125*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemEVA"; 126*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerclass LLE_DESC : LLE_DESC_BASE<"lle", GPR32Opnd, II_LLE>; 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerclass SCE_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 132*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> { 133*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs GPROpnd:$dst); 134*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr); 135*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 136*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 137*9880d681SAndroid Build Coastguard Worker bit mayStore = 1; 138*9880d681SAndroid Build Coastguard Worker string Constraints = "$rt = $dst"; 139*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeMemEVA"; 140*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerclass SCE_DESC : SCE_DESC_BASE<"sce", GPR32Opnd, II_SCE>; 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerclass TLB_DESC_BASE<string instr_asm, InstrItinClass itin = NoItinerary> { 146*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 147*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins); 148*9880d681SAndroid Build Coastguard Worker string AsmString = instr_asm; 149*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 150*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerclass TLBINV_DESC : TLB_DESC_BASE<"tlbinv", II_TLBINV>; 154*9880d681SAndroid Build Coastguard Workerclass TLBINVF_DESC : TLB_DESC_BASE<"tlbinvf", II_TLBINVF>; 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerclass CACHEE_DESC_BASE<string instr_asm, Operand MemOpnd, 157*9880d681SAndroid Build Coastguard Worker InstrItinClass itin = NoItinerary> { 158*9880d681SAndroid Build Coastguard Worker dag OutOperandList = (outs); 159*9880d681SAndroid Build Coastguard Worker dag InOperandList = (ins MemOpnd:$addr, uimm5:$hint); 160*9880d681SAndroid Build Coastguard Worker string AsmString = !strconcat(instr_asm, "\t$hint, $addr"); 161*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = []; 162*9880d681SAndroid Build Coastguard Worker string DecoderMethod = "DecodeCacheeOp_CacheOpR6"; 163*9880d681SAndroid Build Coastguard Worker InstrItinClass Itinerary = itin; 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerclass CACHEE_DESC : CACHEE_DESC_BASE<"cachee", mem_simm9, II_CACHEE>; 167*9880d681SAndroid Build Coastguard Workerclass PREFE_DESC : CACHEE_DESC_BASE<"prefe", mem_simm9, II_PREFE>; 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 170*9880d681SAndroid Build Coastguard Worker// 171*9880d681SAndroid Build Coastguard Worker// Instruction definitions 172*9880d681SAndroid Build Coastguard Worker// 173*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker/// Load and Store EVA Instructions 176*9880d681SAndroid Build Coastguard Workerdef LBE : LBE_ENC, LBE_DESC, INSN_EVA; 177*9880d681SAndroid Build Coastguard Workerdef LBuE : LBuE_ENC, LBuE_DESC, INSN_EVA; 178*9880d681SAndroid Build Coastguard Workerdef LHE : LHE_ENC, LHE_DESC, INSN_EVA; 179*9880d681SAndroid Build Coastguard Workerdef LHuE : LHuE_ENC, LHuE_DESC, INSN_EVA; 180*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 181*9880d681SAndroid Build Coastguard Workerdef LWE : LWE_ENC, LWE_DESC, INSN_EVA; 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Workerdef SBE : SBE_ENC, SBE_DESC, INSN_EVA; 184*9880d681SAndroid Build Coastguard Workerdef SHE : SHE_ENC, SHE_DESC, INSN_EVA; 185*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 186*9880d681SAndroid Build Coastguard Workerdef SWE : SWE_ENC, SWE_DESC, INSN_EVA; 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker/// load/store left/right EVA 190*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 191*9880d681SAndroid Build Coastguard Workerdef LWLE : LWLE_ENC, LWLE_DESC, INSN_EVA_NOT_32R6_64R6; 192*9880d681SAndroid Build Coastguard Workerdef LWRE : LWRE_ENC, LWRE_DESC, INSN_EVA_NOT_32R6_64R6; 193*9880d681SAndroid Build Coastguard Workerdef SWLE : SWLE_ENC, SWLE_DESC, INSN_EVA_NOT_32R6_64R6; 194*9880d681SAndroid Build Coastguard Workerdef SWRE : SWRE_ENC, SWRE_DESC, INSN_EVA_NOT_32R6_64R6; 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker/// Load-linked EVA, Store-conditional EVA 198*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 199*9880d681SAndroid Build Coastguard Workerdef LLE : LLE_ENC, LLE_DESC, INSN_EVA; 200*9880d681SAndroid Build Coastguard Workerdef SCE : SCE_ENC, SCE_DESC, INSN_EVA; 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerlet AdditionalPredicates = [NotInMicroMips] in { 204*9880d681SAndroid Build Coastguard Worker def TLBINV : TLBINV_ENC, TLBINV_DESC, INSN_EVA; 205*9880d681SAndroid Build Coastguard Worker def TLBINVF : TLBINVF_ENC, TLBINVF_DESC, INSN_EVA; 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerdef CACHEE : CACHEE_ENC, CACHEE_DESC, INSN_EVA; 209*9880d681SAndroid Build Coastguard Workerdef PREFE : PREFE_ENC, PREFE_DESC, INSN_EVA; 210