Index: llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td =================================================================== --- llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td +++ llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td @@ -245,6 +245,7 @@ class MSUBF_S_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"msubf.s", 0, 0b111111000>; class MSUBF_D_MMR6_ENC : POOL32F_ARITHF_FM_MMR6<"msubf.d", 1, 0b111111000>; class FMOV_S_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"mov.s", 0, 0b0000001>; +class FMOV_D_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"mov.d", 1, 0b0000001>; class FNEG_S_MMR6_ENC : POOL32F_MOV_NEG_FM_MMR6<"neg.s", 0, 0b0101101>; class MAX_S_MMR6_ENC : POOL32F_MINMAX_FM<"max.s", 0, 0b000001011>; class MAX_D_MMR6_ENC : POOL32F_MINMAX_FM<"max.d", 1, 0b000001011>; @@ -889,6 +890,8 @@ } class FMOV_S_MMR6_DESC : FMOV_FNEG_MMR6_DESC_BASE<"mov.s", FGR32Opnd, FGR32Opnd, II_MOV_S>; +class FMOV_D_MMR6_DESC + : FMOV_FNEG_MMR6_DESC_BASE<"mov.d", FGR64Opnd, FGR64Opnd, II_MOV_D>; class FNEG_S_MMR6_DESC : FMOV_FNEG_MMR6_DESC_BASE<"neg.s", FGR32Opnd, FGR32Opnd, II_NEG, fneg>; @@ -1461,6 +1464,8 @@ ISA_MICROMIPS32R6; def FMOV_S_MMR6 : StdMMR6Rel, FMOV_S_MMR6_ENC, FMOV_S_MMR6_DESC, ISA_MICROMIPS32R6; +def FMOV_D_MMR6 : StdMMR6Rel, FMOV_D_MMR6_ENC, FMOV_D_MMR6_DESC, + ISA_MICROMIPS32R6; def FNEG_S_MMR6 : StdMMR6Rel, FNEG_S_MMR6_ENC, FNEG_S_MMR6_DESC, ISA_MICROMIPS32R6; def MAX_S_MMR6 : R6MMR6Rel, MAX_S_MMR6_ENC, MAX_S_MMR6_DESC, ISA_MICROMIPS32R6; Index: llvm/lib/Target/Mips/MicroMipsInstrFPU.td =================================================================== --- llvm/lib/Target/Mips/MicroMipsInstrFPU.td +++ llvm/lib/Target/Mips/MicroMipsInstrFPU.td @@ -113,8 +113,7 @@ ISA_MICROMIPS, FGR_32 { string DecoderNamespace = "MicroMips"; } - // FIXME: This needs to be part of the instruction mapping tables. - def _D64_MM : ABSS_FT, + def _D64_MM : StdMMR6Rel, ABSS_FT, ISA_MICROMIPS, FGR_64 { string DecoderNamespace = "MicroMipsFP64"; } Index: llvm/lib/Target/Mips/MipsInstrFPU.td =================================================================== --- llvm/lib/Target/Mips/MipsInstrFPU.td +++ llvm/lib/Target/Mips/MipsInstrFPU.td @@ -142,7 +142,7 @@ SDPatternOperator OpNode= null_frag> { def _D32 : MMRel, ABSS_FT, FGR_32; - def _D64 : ABSS_FT, FGR_64 { + def _D64 : StdMMR6Rel, ABSS_FT, FGR_64 { string DecoderNamespace = "MipsFP64"; } } @@ -550,12 +550,7 @@ let isMoveReg = 1 in { def FMOV_S : MMRel, ABSS_FT<"mov.s", FGR32Opnd, FGR32Opnd, II_MOV_S>, ABSS_FM<0x6, 16>, ISA_MIPS1; - def FMOV_D32 : MMRel, ABSS_FT<"mov.d", AFGR64Opnd, AFGR64Opnd, II_MOV_D>, - ABSS_FM<0x6, 17>, ISA_MIPS1, FGR_32; - def FMOV_D64 : ABSS_FT<"mov.d", FGR64Opnd, FGR64Opnd, II_MOV_D>, - ABSS_FM<0x6, 17>, ISA_MIPS1, FGR_64 { - let DecoderNamespace = "MipsFP64"; - } + defm FMOV : ABSS_M<"mov.d", II_MOV_D>, ABSS_FM<0x6, 17>, ISA_MIPS1; } // isMoveReg } Index: llvm/test/CodeGen/Mips/micromips-mtc-mfc.ll =================================================================== --- llvm/test/CodeGen/Mips/micromips-mtc-mfc.ll +++ llvm/test/CodeGen/Mips/micromips-mtc-mfc.ll @@ -23,7 +23,7 @@ ; ; MM6-LABEL: foo: ; MM6: # %bb.0: # %entry -; MM6-NEXT: mov.d $f0, $f12 # encoding: [0x46,0x20,0x60,0x06] +; MM6-NEXT: mov.d $f0, $f12 # encoding: [0x54,0x0c,0x20,0x7b] ; MM6-NEXT: mtc1 $zero, $f1 # encoding: [0x54,0x01,0x28,0x3b] ; MM6-NEXT: mthc1 $zero, $f1 # encoding: [0x54,0x01,0x38,0x3b] ; MM6-NEXT: cmp.ule.d $f1, $f12, $f1 # encoding: [0x54,0x2c,0x09,0xd5]