From: Akira Hatanaka Date: Fri, 21 Dec 2012 22:58:55 +0000 (+0000) Subject: [mips] Refactor load/store instructions. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=16164657d88c50be59a3fbff035ded786a98cf7f;p=oota-llvm.git [mips] Refactor load/store instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170948 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Mips/Mips64InstrInfo.td b/lib/Target/Mips/Mips64InstrInfo.td index c37f61862b3..17455b75b6d 100644 --- a/lib/Target/Mips/Mips64InstrInfo.td +++ b/lib/Target/Mips/Mips64InstrInfo.td @@ -128,17 +128,17 @@ let Predicates = [HasMips64r2, HasStdEnc], let DecoderNamespace = "Mips64" in { /// Load and Store Instructions /// aligned -defm LB64 : LoadM64<0x20, "lb", sextloadi8>; -defm LBu64 : LoadM64<0x24, "lbu", zextloadi8>; -defm LH64 : LoadM64<0x21, "lh", sextloadi16>; -defm LHu64 : LoadM64<0x25, "lhu", zextloadi16>; -defm LW64 : LoadM64<0x23, "lw", sextloadi32>; -defm LWu64 : LoadM64<0x27, "lwu", zextloadi32>; -defm SB64 : StoreM64<0x28, "sb", truncstorei8>; -defm SH64 : StoreM64<0x29, "sh", truncstorei16>; -defm SW64 : StoreM64<0x2b, "sw", truncstorei32>; -defm LD : LoadM64<0x37, "ld", load>; -defm SD : StoreM64<0x3f, "sd", store>; +defm LB64 : LoadM<"lb", sextloadi8, CPU64Regs>, LW_FM<0x20>; +defm LBu64 : LoadM<"lbu", zextloadi8, CPU64Regs>, LW_FM<0x24>; +defm LH64 : LoadM<"lh", sextloadi16, CPU64Regs>, LW_FM<0x21>; +defm LHu64 : LoadM<"lhu", zextloadi16, CPU64Regs>, LW_FM<0x25>; +defm LW64 : LoadM<"lw", sextloadi32, CPU64Regs>, LW_FM<0x23>; +defm LWu64 : LoadM<"lwu", zextloadi32, CPU64Regs>, LW_FM<0x27>; +defm SB64 : StoreM<"sb", truncstorei8, CPU64Regs>, LW_FM<0x28>; +defm SH64 : StoreM<"sh", truncstorei16, CPU64Regs>, LW_FM<0x29>; +defm SW64 : StoreM<"sw", truncstorei32, CPU64Regs>, LW_FM<0x2b>; +defm LD : LoadM<"ld", load, CPU64Regs>, LW_FM<0x37>; +defm SD : StoreM<"sd", store, CPU64Regs>, LW_FM<0x3f>; /// load/store left/right let isCodeGenOnly = 1 in { diff --git a/lib/Target/Mips/MipsInstrInfo.td b/lib/Target/Mips/MipsInstrInfo.td index 21527e37b68..55c87218ce8 100644 --- a/lib/Target/Mips/MipsInstrInfo.td +++ b/lib/Target/Mips/MipsInstrInfo.td @@ -404,58 +404,30 @@ class FMem op, dag outs, dag ins, string asmstr, list pattern, } // Memory Load/Store -let canFoldAsLoad = 1 in -class LoadM op, string instr_asm, PatFrag OpNode, RegisterClass RC, - Operand MemOpnd>: - FMem; - -class StoreM op, string instr_asm, PatFrag OpNode, RegisterClass RC, - Operand MemOpnd>: - FMem; - -// 32-bit load. -multiclass LoadM32 op, string instr_asm, PatFrag OpNode> { - def #NAME# : LoadM, - Requires<[NotN64, HasStdEnc]>; - def _P8 : LoadM, - Requires<[IsN64, HasStdEnc]> { - let DecoderNamespace = "Mips64"; - let isCodeGenOnly = 1; - } +class Load : + InstSE<(outs RC:$rt), (ins MemOpnd:$addr), !strconcat(opstr, "\t$rt, $addr"), + [(set RC:$rt, (OpNode addr:$addr))], NoItinerary, FrmI> { + let DecoderMethod = "DecodeMem"; + let canFoldAsLoad = 1; } -// 64-bit load. -multiclass LoadM64 op, string instr_asm, PatFrag OpNode> { - def #NAME# : LoadM, - Requires<[NotN64, HasStdEnc]>; - def _P8 : LoadM, - Requires<[IsN64, HasStdEnc]> { - let DecoderNamespace = "Mips64"; - let isCodeGenOnly = 1; - } +class Store : + InstSE<(outs), (ins RC:$rt, MemOpnd:$addr), !strconcat(opstr, "\t$rt, $addr"), + [(OpNode RC:$rt, addr:$addr)], NoItinerary, FrmI> { + let DecoderMethod = "DecodeMem"; } -// 32-bit store. -multiclass StoreM32 op, string instr_asm, PatFrag OpNode> { - def #NAME# : StoreM, - Requires<[NotN64, HasStdEnc]>; - def _P8 : StoreM, - Requires<[IsN64, HasStdEnc]> { +multiclass LoadM { + def #NAME# : Load, Requires<[NotN64, HasStdEnc]>; + def _P8 : Load, Requires<[IsN64, HasStdEnc]> { let DecoderNamespace = "Mips64"; let isCodeGenOnly = 1; } } -// 64-bit store. -multiclass StoreM64 op, string instr_asm, PatFrag OpNode> { - def #NAME# : StoreM, - Requires<[NotN64, HasStdEnc]>; - def _P8 : StoreM, - Requires<[IsN64, HasStdEnc]> { +multiclass StoreM { + def #NAME# : Store, Requires<[NotN64, HasStdEnc]>; + def _P8 : Store, Requires<[IsN64, HasStdEnc]> { let DecoderNamespace = "Mips64"; let isCodeGenOnly = 1; } @@ -868,14 +840,14 @@ let Predicates = [HasMips32r2, HasStdEnc] in { /// Load and Store Instructions /// aligned -defm LB : LoadM32<0x20, "lb", sextloadi8>; -defm LBu : LoadM32<0x24, "lbu", zextloadi8>; -defm LH : LoadM32<0x21, "lh", sextloadi16>; -defm LHu : LoadM32<0x25, "lhu", zextloadi16>; -defm LW : LoadM32<0x23, "lw", load>; -defm SB : StoreM32<0x28, "sb", truncstorei8>; -defm SH : StoreM32<0x29, "sh", truncstorei16>; -defm SW : StoreM32<0x2b, "sw", store>; +defm LB : LoadM<"lb", sextloadi8, CPURegs>, LW_FM<0x20>; +defm LBu : LoadM<"lbu", zextloadi8, CPURegs>, LW_FM<0x24>; +defm LH : LoadM<"lh", sextloadi16, CPURegs>, LW_FM<0x21>; +defm LHu : LoadM<"lhu", zextloadi16, CPURegs>, LW_FM<0x25>; +defm LW : LoadM<"lw", load, CPURegs>, LW_FM<0x23>; +defm SB : StoreM<"sb", truncstorei8, CPURegs>, LW_FM<0x28>; +defm SH : StoreM<"sh", truncstorei16, CPURegs>, LW_FM<0x29>; +defm SW : StoreM<"sw", store, CPURegs>, LW_FM<0x2b>; /// load/store left/right defm LWL : LoadLeftRightM32<0x22, "lwl", MipsLWL>;