From dadd1fba3280295936f556acbdc3fbb68b496bad Mon Sep 17 00:00:00 2001 From: Vladimir Medic Date: Fri, 6 Sep 2013 12:53:21 +0000 Subject: [PATCH] This patch adds support for microMIPS Move to/from HI/LO instructions. Test cases are included in patch. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190152 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MicroMipsInstrFormats.td | 24 ++++++++++++++++++++++ lib/Target/Mips/MicroMipsInstrInfo.td | 10 +++++++++ lib/Target/Mips/MipsInstrFormats.td | 4 ++-- lib/Target/Mips/MipsInstrInfo.td | 14 +++++++------ test/MC/Disassembler/Mips/micromips.txt | 12 +++++++++++ test/MC/Disassembler/Mips/micromips_le.txt | 12 +++++++++++ 6 files changed, 68 insertions(+), 8 deletions(-) diff --git a/lib/Target/Mips/MicroMipsInstrFormats.td b/lib/Target/Mips/MicroMipsInstrFormats.td index 2577fe681d0..6d8d29e46d4 100644 --- a/lib/Target/Mips/MicroMipsInstrFormats.td +++ b/lib/Target/Mips/MicroMipsInstrFormats.td @@ -138,3 +138,27 @@ class CMov_F_I_FM_MM func> : MMArch { let Inst{12-6} = func; let Inst{5-0} = 0x3b; } + +class MTLO_FM_MM funct> : MMArch { + bits<5> rs; + + bits<32> Inst; + + let Inst{31-26} = 0x00; + let Inst{25-21} = 0x00; + let Inst{20-16} = rs; + let Inst{15-6} = funct; + let Inst{5-0} = 0x3c; +} + +class MFLO_FM_MM funct> : MMArch { + bits<5> rd; + + bits<32> Inst; + + let Inst{31-26} = 0x00; + let Inst{25-21} = 0x00; + let Inst{20-16} = rd; + let Inst{15-6} = funct; + let Inst{5-0} = 0x3c; +} diff --git a/lib/Target/Mips/MicroMipsInstrInfo.td b/lib/Target/Mips/MicroMipsInstrInfo.td index 0c95d062498..3c3e764b53d 100644 --- a/lib/Target/Mips/MicroMipsInstrInfo.td +++ b/lib/Target/Mips/MicroMipsInstrInfo.td @@ -119,4 +119,14 @@ let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in { CMov_F_I_FM_MM<0x25>; def MOVF_I_MM : MMRel, CMov_F_I_FT<"movf", GPR32Opnd, IIAlu>, CMov_F_I_FM_MM<0x5>; + + /// Move to/from HI/LO + def MTHI_MM : MMRel, MoveToLOHI<"mthi", GPR32Opnd, [HI0]>, + MTLO_FM_MM<0x0b5>; + def MTLO_MM : MMRel, MoveToLOHI<"mtlo", GPR32Opnd, [LO0]>, + MTLO_FM_MM<0x0f5>; + def MFHI_MM : MMRel, MoveFromLOHI<"mfhi", GPR32Opnd, [HI0]>, + MFLO_FM_MM<0x035>; + def MFLO_MM : MMRel, MoveFromLOHI<"mflo", GPR32Opnd, [LO0]>, + MFLO_FM_MM<0x075>; } diff --git a/lib/Target/Mips/MipsInstrFormats.td b/lib/Target/Mips/MipsInstrFormats.td index dd16e1f87e5..f87d70e403e 100644 --- a/lib/Target/Mips/MipsInstrFormats.td +++ b/lib/Target/Mips/MipsInstrFormats.td @@ -321,7 +321,7 @@ class SLTI_FM op> : StdArch { let Inst{15-0} = imm16; } -class MFLO_FM funct> { +class MFLO_FM funct> : StdArch { bits<5> rd; bits<32> Inst; @@ -333,7 +333,7 @@ class MFLO_FM funct> { let Inst{5-0} = funct; } -class MTLO_FM funct> { +class MTLO_FM funct> : StdArch { bits<5> rs; bits<32> Inst; diff --git a/lib/Target/Mips/MipsInstrInfo.td b/lib/Target/Mips/MipsInstrInfo.td index 9b6c8575eec..992933441ec 100644 --- a/lib/Target/Mips/MipsInstrInfo.td +++ b/lib/Target/Mips/MipsInstrInfo.td @@ -690,13 +690,15 @@ class Div UseRegs>: - InstSE<(outs RO:$rd), (ins), !strconcat(opstr, "\t$rd"), [], IIHiLo, FrmR> { + InstSE<(outs RO:$rd), (ins), !strconcat(opstr, "\t$rd"), [], IIHiLo, + FrmR, opstr> { let Uses = UseRegs; let neverHasSideEffects = 1; } class MoveToLOHI DefRegs>: - InstSE<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"), [], IIHiLo, FrmR> { + InstSE<(outs), (ins RO:$rs), !strconcat(opstr, "\t$rs"), [], IIHiLo, + FrmR, opstr> { let Defs = DefRegs; let neverHasSideEffects = 1; } @@ -1016,10 +1018,10 @@ def PseudoSDIV : MultDivPseudo; -def MTHI : MoveToLOHI<"mthi", GPR32Opnd, [HI0]>, MTLO_FM<0x11>; -def MTLO : MoveToLOHI<"mtlo", GPR32Opnd, [LO0]>, MTLO_FM<0x13>; -def MFHI : MoveFromLOHI<"mfhi", GPR32Opnd, [HI0]>, MFLO_FM<0x10>; -def MFLO : MoveFromLOHI<"mflo", GPR32Opnd, [LO0]>, MFLO_FM<0x12>; +def MTHI : MMRel, MoveToLOHI<"mthi", GPR32Opnd, [HI0]>, MTLO_FM<0x11>; +def MTLO : MMRel, MoveToLOHI<"mtlo", GPR32Opnd, [LO0]>, MTLO_FM<0x13>; +def MFHI : MMRel, MoveFromLOHI<"mfhi", GPR32Opnd, [HI0]>, MFLO_FM<0x10>; +def MFLO : MMRel, MoveFromLOHI<"mflo", GPR32Opnd, [LO0]>, MFLO_FM<0x12>; /// Sign Ext In Register Instructions. def SEB : SignExtInReg<"seb", i8, GPR32Opnd>, SEB_FM<0x10, 0x20>; diff --git a/test/MC/Disassembler/Mips/micromips.txt b/test/MC/Disassembler/Mips/micromips.txt index 683c7a05743..6979c790f8e 100644 --- a/test/MC/Disassembler/Mips/micromips.txt +++ b/test/MC/Disassembler/Mips/micromips.txt @@ -159,3 +159,15 @@ # CHECK: movf $9, $6, $fcc0 0x55 0x26 0x01 0x7b + +# CHECK: mthi $6 +0x00 0x06 0x2d 0x7c + +# CHECK: mfhi $6 +0x00 0x06 0x0d 0x7c + +# CHECK: mtlo $6 +0x00 0x06 0x3d 0x7c + +# CHECK: mflo $6 +0x00 0x06 0x1d 0x7c diff --git a/test/MC/Disassembler/Mips/micromips_le.txt b/test/MC/Disassembler/Mips/micromips_le.txt index fb183cdb494..8c32af60d1f 100644 --- a/test/MC/Disassembler/Mips/micromips_le.txt +++ b/test/MC/Disassembler/Mips/micromips_le.txt @@ -159,3 +159,15 @@ # CHECK: movf $9, $6, $fcc0 0x26 0x55 0x7b 0x01 + +# CHECK: mthi $6 +0x06 0x00 0x7c 0x2d + +# CHECK: mfhi $6 +0x06 0x00 0x7c 0x0d + +# CHECK: mtlo $6 +0x06 0x00 0x7c 0x3d + +# CHECK: mflo $6 +0x06 0x00 0x7c 0x1d