diff options
author | Vladimir Medic <Vladimir.Medic@imgtec.com> | 2013-09-06 12:53:21 +0000 |
---|---|---|
committer | Vladimir Medic <Vladimir.Medic@imgtec.com> | 2013-09-06 12:53:21 +0000 |
commit | dadd1fba3280295936f556acbdc3fbb68b496bad (patch) | |
tree | 1f31b5702fbb2a479d9011160b677a88b73cb921 | |
parent | 9e935a77a59fc14acf1936165f235342b741e34a (diff) | |
download | external_llvm-dadd1fba3280295936f556acbdc3fbb68b496bad.zip external_llvm-dadd1fba3280295936f556acbdc3fbb68b496bad.tar.gz external_llvm-dadd1fba3280295936f556acbdc3fbb68b496bad.tar.bz2 |
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
-rw-r--r-- | lib/Target/Mips/MicroMipsInstrFormats.td | 24 | ||||
-rw-r--r-- | lib/Target/Mips/MicroMipsInstrInfo.td | 10 | ||||
-rw-r--r-- | lib/Target/Mips/MipsInstrFormats.td | 4 | ||||
-rw-r--r-- | lib/Target/Mips/MipsInstrInfo.td | 14 | ||||
-rw-r--r-- | test/MC/Disassembler/Mips/micromips.txt | 12 | ||||
-rw-r--r-- | 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 2577fe6..6d8d29e 100644 --- a/lib/Target/Mips/MicroMipsInstrFormats.td +++ b/lib/Target/Mips/MicroMipsInstrFormats.td @@ -138,3 +138,27 @@ class CMov_F_I_FM_MM<bits<7> func> : MMArch { let Inst{12-6} = func; let Inst{5-0} = 0x3b; } + +class MTLO_FM_MM<bits<10> 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<bits<10> 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 0c95d06..3c3e764 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 dd16e1f..f87d70e 100644 --- a/lib/Target/Mips/MipsInstrFormats.td +++ b/lib/Target/Mips/MipsInstrFormats.td @@ -321,7 +321,7 @@ class SLTI_FM<bits<6> op> : StdArch { let Inst{15-0} = imm16; } -class MFLO_FM<bits<6> funct> { +class MFLO_FM<bits<6> funct> : StdArch { bits<5> rd; bits<32> Inst; @@ -333,7 +333,7 @@ class MFLO_FM<bits<6> funct> { let Inst{5-0} = funct; } -class MTLO_FM<bits<6> funct> { +class MTLO_FM<bits<6> funct> : StdArch { bits<5> rs; bits<32> Inst; diff --git a/lib/Target/Mips/MipsInstrInfo.td b/lib/Target/Mips/MipsInstrInfo.td index 9b6c857..9929334 100644 --- a/lib/Target/Mips/MipsInstrInfo.td +++ b/lib/Target/Mips/MipsInstrInfo.td @@ -690,13 +690,15 @@ class Div<string opstr, InstrItinClass itin, RegisterOperand RO, // Move from Hi/Lo class MoveFromLOHI<string opstr, RegisterOperand RO, list<Register> 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<string opstr, RegisterOperand RO, list<Register> 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<SDIV, ACC64, GPR32Opnd, MipsDivRem, IIIdiv, def PseudoUDIV : MultDivPseudo<UDIV, ACC64, GPR32Opnd, MipsDivRemU, IIIdiv, 0, 1, 1>; -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 683c7a0..6979c79 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 fb183cd..8c32af6 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 |