diff --git a/lib/Target/Mips/Mips64InstrInfo.td b/lib/Target/Mips/Mips64InstrInfo.td index 53a5b37e9ff..7e129b8b8da 100644 --- a/lib/Target/Mips/Mips64InstrInfo.td +++ b/lib/Target/Mips/Mips64InstrInfo.td @@ -141,6 +141,18 @@ defm USW64 : StoreM64<0x2b, "usw", truncstorei32_u, 1>; defm ULD : LoadM64<0x37, "uld", load_u, 1>; defm USD : StoreM64<0x3f, "usd", store_u, 1>; +/// load/store left/right +let isCodeGenOnly = 1 in { + defm LWL64 : LoadLeftRightM64<0x22, "lwl", MipsLWL>; + defm LWR64 : LoadLeftRightM64<0x26, "lwr", MipsLWR>; + defm SWL64 : StoreLeftRightM64<0x2a, "swl", MipsSWL>; + defm SWR64 : StoreLeftRightM64<0x2e, "swr", MipsSWR>; +} +defm LDL : LoadLeftRightM64<0x1a, "ldl", MipsLDL>; +defm LDR : LoadLeftRightM64<0x1b, "ldr", MipsLDR>; +defm SDL : StoreLeftRightM64<0x2c, "sdl", MipsSDL>; +defm SDR : StoreLeftRightM64<0x2d, "sdr", MipsSDR>; + /// Load-linked, Store-conditional def LLD : LLBase<0x34, "lld", CPU64Regs, mem>, Requires<[NotN64, HasStandardEncoding]>; diff --git a/lib/Target/Mips/MipsInstrInfo.td b/lib/Target/Mips/MipsInstrInfo.td index 53cfb957395..a9af4e65dfa 100644 --- a/lib/Target/Mips/MipsInstrInfo.td +++ b/lib/Target/Mips/MipsInstrInfo.td @@ -445,14 +445,6 @@ class StoreM op, string instr_asm, PatFrag OpNode, RegisterClass RC, let isPseudo = Pseudo; } -// Unaligned Memory Load/Store -let canFoldAsLoad = 1 in -class LoadUnAlign op, RegisterClass RC, Operand MemOpnd>: - FMem {} - -class StoreUnAlign op, RegisterClass RC, Operand MemOpnd>: - FMem {} - // 32-bit load. multiclass LoadM32 op, string instr_asm, PatFrag OpNode, bit Pseudo = 0> { @@ -477,16 +469,6 @@ multiclass LoadM64 op, string instr_asm, PatFrag OpNode, } } -// 32-bit load. -multiclass LoadUnAlign32 op> { - def #NAME# : LoadUnAlign, - Requires<[NotN64, HasStandardEncoding]>; - def _P8 : LoadUnAlign, - Requires<[IsN64, HasStandardEncoding]> { - let DecoderNamespace = "Mips64"; - let isCodeGenOnly = 1; - } -} // 32-bit store. multiclass StoreM32 op, string instr_asm, PatFrag OpNode, bit Pseudo = 0> { @@ -511,11 +493,60 @@ multiclass StoreM64 op, string instr_asm, PatFrag OpNode, } } -// 32-bit store. -multiclass StoreUnAlign32 op> { - def #NAME# : StoreUnAlign, +// Load/Store Left/Right +let canFoldAsLoad = 1 in +class LoadLeftRight op, string instr_asm, SDNode OpNode, + RegisterClass RC, Operand MemOpnd> : + FMem { + string Constraints = "$src = $rt"; +} + +class StoreLeftRight op, string instr_asm, SDNode OpNode, + RegisterClass RC, Operand MemOpnd>: + FMem; + +// 32-bit load left/right. +multiclass LoadLeftRightM32 op, string instr_asm, SDNode OpNode> { + def #NAME# : LoadLeftRight, Requires<[NotN64, HasStandardEncoding]>; - def _P8 : StoreUnAlign, + def _P8 : LoadLeftRight, + Requires<[IsN64, HasStandardEncoding]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } +} + +// 64-bit load left/right. +multiclass LoadLeftRightM64 op, string instr_asm, SDNode OpNode> { + def #NAME# : LoadLeftRight, + Requires<[NotN64, HasStandardEncoding]>; + def _P8 : LoadLeftRight, + Requires<[IsN64, HasStandardEncoding]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } +} + +// 32-bit store left/right. +multiclass StoreLeftRightM32 op, string instr_asm, SDNode OpNode> { + def #NAME# : StoreLeftRight, + Requires<[NotN64, HasStandardEncoding]>; + def _P8 : StoreLeftRight, + Requires<[IsN64, HasStandardEncoding]> { + let DecoderNamespace = "Mips64"; + let isCodeGenOnly = 1; + } +} + +// 64-bit store left/right. +multiclass StoreLeftRightM64 op, string instr_asm, SDNode OpNode> { + def #NAME# : StoreLeftRight, + Requires<[NotN64, HasStandardEncoding]>; + def _P8 : StoreLeftRight, Requires<[IsN64, HasStandardEncoding]> { let DecoderNamespace = "Mips64"; let isCodeGenOnly = 1; @@ -907,11 +938,11 @@ defm ULW : LoadM32<0x23, "ulw", load_u, 1>; defm USH : StoreM32<0x29, "ush", truncstorei16_u, 1>; defm USW : StoreM32<0x2b, "usw", store_u, 1>; -/// Primitives for unaligned -defm LWL : LoadUnAlign32<0x22>; -defm LWR : LoadUnAlign32<0x26>; -defm SWL : StoreUnAlign32<0x2A>; -defm SWR : StoreUnAlign32<0x2E>; +/// load/store left/right +defm LWL : LoadLeftRightM32<0x22, "lwl", MipsLWL>; +defm LWR : LoadLeftRightM32<0x26, "lwr", MipsLWR>; +defm SWL : StoreLeftRightM32<0x2a, "swl", MipsSWL>; +defm SWR : StoreLeftRightM32<0x2e, "swr", MipsSWR>; let hasSideEffects = 1 in def SYNC : MipsInst<(outs), (ins i32imm:$stype), "sync $stype",