diff options
| author | Hrvoje Varga <Hrvoje.Varga@imgtec.com> | 2016-08-04 11:22:52 +0000 |
|---|---|---|
| committer | Hrvoje Varga <Hrvoje.Varga@imgtec.com> | 2016-08-04 11:22:52 +0000 |
| commit | 846bdb746d16ed28ee83dfaf5c9103f7ee06580b (patch) | |
| tree | d4112b494091720c7dedc09d9c717bf3030a6dca /llvm/lib | |
| parent | c8fe13275677e31ec72e639d2e9db91df07214f1 (diff) | |
| download | bcm5719-llvm-846bdb746d16ed28ee83dfaf5c9103f7ee06580b.tar.gz bcm5719-llvm-846bdb746d16ed28ee83dfaf5c9103f7ee06580b.zip | |
[mips][microMIPS] Implement CFC1, CFC2, CTC1 and CTC2 instructions
Differential Revision: https://reviews.llvm.org/D22347
llvm-svn: 277719
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Mips/MicroMipsInstrFPU.td | 11 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MicroMipsInstrFormats.td | 13 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MicroMipsInstrInfo.td | 8 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsInstrFPU.td | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsSchedule.td | 4 |
5 files changed, 35 insertions, 7 deletions
diff --git a/llvm/lib/Target/Mips/MicroMipsInstrFPU.td b/llvm/lib/Target/Mips/MicroMipsInstrFPU.td index 7b0e00bd1c3..ed92265e47f 100644 --- a/llvm/lib/Target/Mips/MicroMipsInstrFPU.td +++ b/llvm/lib/Target/Mips/MicroMipsInstrFPU.td @@ -99,11 +99,6 @@ def MOVT_D32_MM : MMRel, CMov_F_F_FT<"movt.d", AFGR64Opnd, II_MOVT_D, MipsCMovFP_T>, CMov_F_F_FM_MM<0x60, 1>; def MOVF_D32_MM : MMRel, CMov_F_F_FT<"movf.d", AFGR64Opnd, II_MOVF_D, MipsCMovFP_F>, CMov_F_F_FM_MM<0x20, 1>; - -def CFC1_MM : MMRel, MFC1_FT<"cfc1", GPR32Opnd, CCROpnd, II_CFC1>, - MFC1_FM_MM<0x40>; -def CTC1_MM : MMRel, MTC1_FT<"ctc1", CCROpnd, GPR32Opnd, II_CTC1>, - MFC1_FM_MM<0x60>; def MFC1_MM : MMRel, MFC1_FT<"mfc1", GPR32Opnd, FGR32Opnd, II_MFC1, bitconvert>, MFC1_FM_MM<0x80>; def MTC1_MM : MMRel, MTC1_FT<"mtc1", FGR32Opnd, GPR32Opnd, @@ -141,6 +136,12 @@ let AdditionalPredicates = [InMicroMips] in { MFC1_FM_MM<0xe0>, ISA_MIPS32R2, FGR_32; def MFHC1_MM : MMRel, MFC1_FT<"mfhc1", GPR32Opnd, AFGR64Opnd, II_MFHC1>, MFC1_FM_MM<0xc0>, ISA_MIPS32R2, FGR_32; + let DecoderNamespace = "MicroMips" in { + def CFC1_MM : MMRel, MFC1_FT<"cfc1", GPR32Opnd, CCROpnd, II_CFC1>, + MFC1_FM_MM<0x40>; + def CTC1_MM : MMRel, MTC1_FT<"ctc1", CCROpnd, GPR32Opnd, II_CTC1>, + MFC1_FM_MM<0x60>; + } let DecoderNamespace = "MicroMips", DecoderMethod = "DecodeFMemMMR2" in { def LDC1_MM : MMRel, LW_FT<"ldc1", AFGR64Opnd, mem_mm_16, II_LDC1, load>, LW_FM_MM<0x2f>, FGR_32 { diff --git a/llvm/lib/Target/Mips/MicroMipsInstrFormats.td b/llvm/lib/Target/Mips/MicroMipsInstrFormats.td index 79ef6482180..68f7fcf6481 100644 --- a/llvm/lib/Target/Mips/MicroMipsInstrFormats.td +++ b/llvm/lib/Target/Mips/MicroMipsInstrFormats.td @@ -1023,3 +1023,16 @@ class ADDIUPC_FM_MM { let Inst{25-23} = rs; let Inst{22-0} = imm; } + +class POOL32A_CFTC2_FM_MM<bits<10> funct> : MMArch { + bits<5> rt; + bits<5> impl; + + bits<32> Inst; + + let Inst{31-26} = 0b000000; + let Inst{25-21} = rt; + let Inst{20-16} = impl; + let Inst{15-6} = funct; + let Inst{5-0} = 0b111100; +} diff --git a/llvm/lib/Target/Mips/MicroMipsInstrInfo.td b/llvm/lib/Target/Mips/MicroMipsInstrInfo.td index de2f7d49844..8b9eb36629f 100644 --- a/llvm/lib/Target/Mips/MicroMipsInstrInfo.td +++ b/llvm/lib/Target/Mips/MicroMipsInstrInfo.td @@ -673,6 +673,14 @@ let DecoderNamespace = "MicroMips" in { ISA_MICROMIPS32_NOT_MIPS32R6; def LWM16_MM : LoadMultMM16<"lwm16">, LWM_FM_MM16<0x4>, ISA_MICROMIPS32_NOT_MIPS32R6; + let AdditionalPredicates = [InMicroMips] in { + def CFC2_MM : InstSE<(outs GPR32Opnd:$rt), (ins COP2Opnd:$impl), + "cfc2\t$rt, $impl", [], II_CFC2, FrmFR, "cfc2">, + POOL32A_CFTC2_FM_MM<0b1100110100>; + def CTC2_MM : InstSE<(outs COP2Opnd:$impl), (ins GPR32Opnd:$rt), + "ctc2\t$rt, $impl", [], II_CTC2, FrmFR, "ctc2">, + POOL32A_CFTC2_FM_MM<0b1101110100>; + } } class WaitMM<string opstr> : diff --git a/llvm/lib/Target/Mips/MipsInstrFPU.td b/llvm/lib/Target/Mips/MipsInstrFPU.td index 87b02bdfdfd..224100e494f 100644 --- a/llvm/lib/Target/Mips/MipsInstrFPU.td +++ b/llvm/lib/Target/Mips/MipsInstrFPU.td @@ -361,8 +361,10 @@ defm FSQRT : ABSS_M<"sqrt.d", II_SQRT_D, fsqrt>, ABSS_FM<0x4, 17>, ISA_MIPS2; // regardless of register aliasing. /// Move Control Registers From/To CPU Registers -def CFC1 : MMRel, MFC1_FT<"cfc1", GPR32Opnd, CCROpnd, II_CFC1>, MFC1_FM<2>; -def CTC1 : MMRel, MTC1_FT<"ctc1", CCROpnd, GPR32Opnd, II_CTC1>, MFC1_FM<6>; +let AdditionalPredicates = [NotInMicroMips] in { + def CFC1 : MMRel, MFC1_FT<"cfc1", GPR32Opnd, CCROpnd, II_CFC1>, MFC1_FM<2>; + def CTC1 : MMRel, MTC1_FT<"ctc1", CCROpnd, GPR32Opnd, II_CTC1>, MFC1_FM<6>; +} def MFC1 : MMRel, MFC1_FT<"mfc1", GPR32Opnd, FGR32Opnd, II_MFC1, bitconvert>, MFC1_FM<0>; def MTC1 : MMRel, MTC1_FT<"mtc1", FGR32Opnd, GPR32Opnd, II_MTC1, diff --git a/llvm/lib/Target/Mips/MipsSchedule.td b/llvm/lib/Target/Mips/MipsSchedule.td index a5ab5254f00..94e4f295b63 100644 --- a/llvm/lib/Target/Mips/MipsSchedule.td +++ b/llvm/lib/Target/Mips/MipsSchedule.td @@ -53,9 +53,11 @@ def II_BCCZC : InstrItinClass; // beqzc, bnezc def II_BITSWAP : InstrItinClass; def II_CEIL : InstrItinClass; def II_CFC1 : InstrItinClass; +def II_CFC2 : InstrItinClass; def II_CLO : InstrItinClass; def II_CLZ : InstrItinClass; def II_CTC1 : InstrItinClass; +def II_CTC2 : InstrItinClass; def II_CVT : InstrItinClass; def II_C_CC_D : InstrItinClass; // Any c.<cc>.d instruction def II_C_CC_S : InstrItinClass; // Any c.<cc>.s instruction @@ -521,6 +523,8 @@ def MipsGenericItineraries : ProcessorItineraries<[ALU, IMULDIV], [], [ InstrItinData<II_MOV_S , [InstrStage<2, [ALU]>]>, InstrItinData<II_CFC1 , [InstrStage<2, [ALU]>]>, InstrItinData<II_CTC1 , [InstrStage<2, [ALU]>]>, + InstrItinData<II_CFC2 , [InstrStage<2, [ALU]>]>, + InstrItinData<II_CTC2 , [InstrStage<2, [ALU]>]>, InstrItinData<II_MOVF_D , [InstrStage<2, [ALU]>]>, InstrItinData<II_MOVF_S , [InstrStage<2, [ALU]>]>, InstrItinData<II_MOVT_D , [InstrStage<2, [ALU]>]>, |

