1292915Sdim//===- MipsEVAInstrInfo.td - EVA ASE instructions -*- tablegen ------------*-=// 2292915Sdim// 3292915Sdim// The LLVM Compiler Infrastructure 4292915Sdim// 5292915Sdim// This file is distributed under the University of Illinois Open Source 6292915Sdim// License. See LICENSE.TXT for details. 7292915Sdim// 8292915Sdim//===----------------------------------------------------------------------===// 9292915Sdim// 10292915Sdim// This file describes Mips EVA ASE instructions. 11292915Sdim// 12292915Sdim//===----------------------------------------------------------------------===// 13292915Sdim 14292915Sdim//===----------------------------------------------------------------------===// 15292915Sdim// 16292915Sdim// Instruction encodings 17292915Sdim// 18292915Sdim//===----------------------------------------------------------------------===// 19292915Sdim 20292915Sdim// Memory Load/Store EVA encodings 21292915Sdimclass LBE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LBE>; 22292915Sdimclass LBuE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LBuE>; 23292915Sdimclass LHE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LHE>; 24292915Sdimclass LHuE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LHuE>; 25292915Sdimclass LWE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWE>; 26292915Sdim 27292915Sdimclass SBE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SBE>; 28292915Sdimclass SHE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SHE>; 29292915Sdimclass SWE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWE>; 30292915Sdim 31292915Sdim// load/store left/right EVA encodings 32292915Sdimclass LWLE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWLE>; 33292915Sdimclass LWRE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LWRE>; 34292915Sdimclass SWLE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWLE>; 35292915Sdimclass SWRE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SWRE>; 36292915Sdim 37292915Sdim// Load-linked EVA, Store-conditional EVA encodings 38292915Sdimclass LLE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_LLE>; 39292915Sdimclass SCE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_SCE>; 40292915Sdim 41292915Sdimclass TLBINV_ENC : TLB_FM<OPCODE6_TLBINV>; 42292915Sdimclass TLBINVF_ENC : TLB_FM<OPCODE6_TLBINVF>; 43292915Sdim 44292915Sdimclass CACHEE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_CACHEE>; 45292915Sdimclass PREFE_ENC : SPECIAL3_EVA_LOAD_STORE_FM<OPCODE6_PREFE>; 46292915Sdim 47292915Sdim//===----------------------------------------------------------------------===// 48292915Sdim// 49292915Sdim// Instruction descriptions 50292915Sdim// 51292915Sdim//===----------------------------------------------------------------------===// 52292915Sdim 53292915Sdim// Memory Load/Store EVA descriptions 54292915Sdimclass LOAD_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> { 55292915Sdim dag OutOperandList = (outs GPROpnd:$rt); 56292915Sdim dag InOperandList = (ins mem_simm9:$addr); 57292915Sdim string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 58292915Sdim list<dag> Pattern = []; 59292915Sdim string DecoderMethod = "DecodeMemEVA"; 60292915Sdim bit canFoldAsLoad = 1; 61292915Sdim bit mayLoad = 1; 62292915Sdim} 63292915Sdim 64292915Sdimclass LBE_DESC : LOAD_EVA_DESC_BASE<"lbe", GPR32Opnd>; 65292915Sdimclass LBuE_DESC : LOAD_EVA_DESC_BASE<"lbue", GPR32Opnd>; 66292915Sdimclass LHE_DESC : LOAD_EVA_DESC_BASE<"lhe", GPR32Opnd>; 67292915Sdimclass LHuE_DESC : LOAD_EVA_DESC_BASE<"lhue", GPR32Opnd>; 68292915Sdimclass LWE_DESC : LOAD_EVA_DESC_BASE<"lwe", GPR32Opnd>; 69292915Sdim 70292915Sdimclass STORE_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd, 71292915Sdim SDPatternOperator OpNode = null_frag> { 72292915Sdim dag OutOperandList = (outs); 73292915Sdim dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr); 74292915Sdim string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 75292915Sdim list<dag> Pattern = []; 76292915Sdim string DecoderMethod = "DecodeMemEVA"; 77292915Sdim bit mayStore = 1; 78292915Sdim} 79292915Sdim 80292915Sdimclass SBE_DESC : STORE_EVA_DESC_BASE<"sbe", GPR32Opnd>; 81292915Sdimclass SHE_DESC : STORE_EVA_DESC_BASE<"she", GPR32Opnd>; 82292915Sdimclass SWE_DESC : STORE_EVA_DESC_BASE<"swe", GPR32Opnd>; 83292915Sdim 84292915Sdim// Load/Store Left/Right EVA descriptions 85292915Sdimclass LOAD_LEFT_RIGHT_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> { 86292915Sdim dag OutOperandList = (outs GPROpnd:$rt); 87292915Sdim dag InOperandList = (ins mem_simm9:$addr, GPROpnd:$src); 88292915Sdim string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 89292915Sdim list<dag> Pattern = []; 90292915Sdim string DecoderMethod = "DecodeMemEVA"; 91292915Sdim string Constraints = "$src = $rt"; 92292915Sdim bit canFoldAsLoad = 1; 93292915Sdim} 94292915Sdim 95292915Sdimclass LWLE_DESC : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"lwle", GPR32Opnd>; 96292915Sdimclass LWRE_DESC : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"lwre", GPR32Opnd>; 97292915Sdim 98292915Sdimclass STORE_LEFT_RIGHT_EVA_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> { 99292915Sdim dag OutOperandList = (outs); 100292915Sdim dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr); 101292915Sdim string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 102292915Sdim list<dag> Pattern = []; 103292915Sdim string DecoderMethod = "DecodeMemEVA"; 104292915Sdim} 105292915Sdim 106292915Sdimclass SWLE_DESC : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"swle", GPR32Opnd>; 107292915Sdimclass SWRE_DESC : LOAD_LEFT_RIGHT_EVA_DESC_BASE<"swre", GPR32Opnd>; 108292915Sdim 109292915Sdim// Load-linked EVA, Store-conditional EVA descriptions 110292915Sdimclass LLE_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> { 111292915Sdim dag OutOperandList = (outs GPROpnd:$rt); 112292915Sdim dag InOperandList = (ins mem_simm9:$addr); 113292915Sdim string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 114292915Sdim list<dag> Pattern = []; 115292915Sdim bit mayLoad = 1; 116292915Sdim string DecoderMethod = "DecodeMemEVA"; 117292915Sdim} 118292915Sdim 119292915Sdimclass LLE_DESC : LLE_DESC_BASE<"lle", GPR32Opnd>; 120292915Sdim 121292915Sdimclass SCE_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> { 122292915Sdim dag OutOperandList = (outs GPROpnd:$dst); 123292915Sdim dag InOperandList = (ins GPROpnd:$rt, mem_simm9:$addr); 124292915Sdim string AsmString = !strconcat(instr_asm, "\t$rt, $addr"); 125292915Sdim list<dag> Pattern = []; 126292915Sdim bit mayStore = 1; 127292915Sdim string Constraints = "$rt = $dst"; 128292915Sdim string DecoderMethod = "DecodeMemEVA"; 129292915Sdim} 130292915Sdim 131292915Sdimclass SCE_DESC : SCE_DESC_BASE<"sce", GPR32Opnd>; 132292915Sdim 133292915Sdimclass TLB_DESC_BASE<string instr_asm> { 134292915Sdim dag OutOperandList = (outs); 135292915Sdim dag InOperandList = (ins); 136292915Sdim string AsmString = instr_asm; 137292915Sdim list<dag> Pattern = []; 138292915Sdim} 139292915Sdim 140292915Sdimclass TLBINV_DESC : TLB_DESC_BASE<"tlbinv">; 141292915Sdimclass TLBINVF_DESC : TLB_DESC_BASE<"tlbinvf">; 142292915Sdim 143292915Sdimclass CACHEE_DESC_BASE<string instr_asm, Operand MemOpnd> { 144292915Sdim dag OutOperandList = (outs); 145292915Sdim dag InOperandList = (ins MemOpnd:$addr, uimm5:$hint); 146292915Sdim string AsmString = !strconcat(instr_asm, "\t$hint, $addr"); 147292915Sdim list<dag> Pattern = []; 148292915Sdim string DecoderMethod = "DecodeCacheeOp_CacheOpR6"; 149292915Sdim} 150292915Sdim 151292915Sdimclass CACHEE_DESC : CACHEE_DESC_BASE<"cachee", mem>; 152292915Sdimclass PREFE_DESC : CACHEE_DESC_BASE<"prefe", mem>; 153292915Sdim 154292915Sdim//===----------------------------------------------------------------------===// 155292915Sdim// 156292915Sdim// Instruction definitions 157292915Sdim// 158292915Sdim//===----------------------------------------------------------------------===// 159292915Sdim 160292915Sdim/// Load and Store EVA Instructions 161292915Sdimdef LBE : LBE_ENC, LBE_DESC, INSN_EVA; 162292915Sdimdef LBuE : LBuE_ENC, LBuE_DESC, INSN_EVA; 163292915Sdimdef LHE : LHE_ENC, LHE_DESC, INSN_EVA; 164292915Sdimdef LHuE : LHuE_ENC, LHuE_DESC, INSN_EVA; 165292915Sdimlet AdditionalPredicates = [NotInMicroMips] in { 166292915Sdimdef LWE : LWE_ENC, LWE_DESC, INSN_EVA; 167292915Sdim} 168292915Sdimdef SBE : SBE_ENC, SBE_DESC, INSN_EVA; 169292915Sdimdef SHE : SHE_ENC, SHE_DESC, INSN_EVA; 170292915Sdimlet AdditionalPredicates = [NotInMicroMips] in { 171292915Sdimdef SWE : SWE_ENC, SWE_DESC, INSN_EVA; 172292915Sdim} 173292915Sdim 174292915Sdim/// load/store left/right EVA 175292915Sdimlet AdditionalPredicates = [NotInMicroMips] in { 176292915Sdimdef LWLE : LWLE_ENC, LWLE_DESC, INSN_EVA_NOT_32R6_64R6; 177292915Sdimdef LWRE : LWRE_ENC, LWRE_DESC, INSN_EVA_NOT_32R6_64R6; 178292915Sdimdef SWLE : SWLE_ENC, SWLE_DESC, INSN_EVA_NOT_32R6_64R6; 179292915Sdimdef SWRE : SWRE_ENC, SWRE_DESC, INSN_EVA_NOT_32R6_64R6; 180292915Sdim} 181292915Sdim 182292915Sdim/// Load-linked EVA, Store-conditional EVA 183292915Sdimlet AdditionalPredicates = [NotInMicroMips] in { 184292915Sdimdef LLE : LLE_ENC, LLE_DESC, INSN_EVA; 185292915Sdimdef SCE : SCE_ENC, SCE_DESC, INSN_EVA; 186292915Sdim} 187292915Sdim 188292915Sdimdef TLBINV : TLBINV_ENC, TLBINV_DESC, INSN_EVA; 189292915Sdimdef TLBINVF : TLBINVF_ENC, TLBINVF_DESC, INSN_EVA; 190292915Sdim 191292915Sdimdef CACHEE : CACHEE_ENC, CACHEE_DESC, INSN_EVA; 192292915Sdimdef PREFE : PREFE_ENC, PREFE_DESC, INSN_EVA; 193