mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
[mips] Fold FeatureSwap into FeatureMips32r2 and FeatureMips64r2
Summary: dsbh and dshd are not available on Mips32r2. No codegen test changes required since expansion of i64 prevented the use of these instructions anyway. Depends on D3690 Reviewers: vmedic Reviewed By: vmedic Differential Revision: http://reviews.llvm.org/D3692 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208542 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4119c5f9f4
commit
d46b2e219d
@ -226,7 +226,8 @@ let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in {
|
|||||||
def SEH_MM : MMRel, SignExtInReg<"seh", i16, GPR32Opnd, II_SEH>, SEB_FM_MM<0x0ec>;
|
def SEH_MM : MMRel, SignExtInReg<"seh", i16, GPR32Opnd, II_SEH>, SEB_FM_MM<0x0ec>;
|
||||||
|
|
||||||
/// Word Swap Bytes Within Halfwords
|
/// Word Swap Bytes Within Halfwords
|
||||||
def WSBH_MM : MMRel, SubwordSwap<"wsbh", GPR32Opnd>, SEB_FM_MM<0x1ec>;
|
def WSBH_MM : MMRel, SubwordSwap<"wsbh", GPR32Opnd>, SEB_FM_MM<0x1ec>,
|
||||||
|
ISA_MIPS32R2;
|
||||||
|
|
||||||
def EXT_MM : MMRel, ExtBase<"ext", GPR32Opnd, uimm5, MipsExt>,
|
def EXT_MM : MMRel, ExtBase<"ext", GPR32Opnd, uimm5, MipsExt>,
|
||||||
EXT_FM_MM<0x2c>;
|
EXT_FM_MM<0x2c>;
|
||||||
|
@ -77,8 +77,6 @@ def FeatureVFPU : SubtargetFeature<"vfpu", "HasVFPU",
|
|||||||
"true", "Enable vector FPU instructions.">;
|
"true", "Enable vector FPU instructions.">;
|
||||||
def FeatureSEInReg : SubtargetFeature<"seinreg", "HasSEInReg", "true",
|
def FeatureSEInReg : SubtargetFeature<"seinreg", "HasSEInReg", "true",
|
||||||
"Enable 'signext in register' instructions.">;
|
"Enable 'signext in register' instructions.">;
|
||||||
def FeatureSwap : SubtargetFeature<"swap", "HasSwap", "true",
|
|
||||||
"Enable 'byte/half swap' instructions.">;
|
|
||||||
def FeatureBitCount : SubtargetFeature<"bitcount", "HasBitCount", "true",
|
def FeatureBitCount : SubtargetFeature<"bitcount", "HasBitCount", "true",
|
||||||
"Enable 'count leading bits' instructions.">;
|
"Enable 'count leading bits' instructions.">;
|
||||||
def FeatureMips1 : SubtargetFeature<"mips1", "MipsArchVersion", "Mips1",
|
def FeatureMips1 : SubtargetFeature<"mips1", "MipsArchVersion", "Mips1",
|
||||||
@ -113,7 +111,7 @@ def FeatureMips32 : SubtargetFeature<"mips32", "MipsArchVersion", "Mips32",
|
|||||||
def FeatureMips32r2 : SubtargetFeature<"mips32r2", "MipsArchVersion",
|
def FeatureMips32r2 : SubtargetFeature<"mips32r2", "MipsArchVersion",
|
||||||
"Mips32r2", "Mips32r2 ISA Support",
|
"Mips32r2", "Mips32r2 ISA Support",
|
||||||
[FeatureMips4_32r2, FeatureMips32,
|
[FeatureMips4_32r2, FeatureMips32,
|
||||||
FeatureSEInReg, FeatureSwap]>;
|
FeatureSEInReg]>;
|
||||||
def FeatureMips32r6 : SubtargetFeature<"mips32r6", "MipsArchVersion",
|
def FeatureMips32r6 : SubtargetFeature<"mips32r6", "MipsArchVersion",
|
||||||
"Mips32r6",
|
"Mips32r6",
|
||||||
"Mips32r6 ISA Support [experimental]",
|
"Mips32r6 ISA Support [experimental]",
|
||||||
|
@ -218,8 +218,8 @@ def DCLZ : CountLeading0<"dclz", GPR64Opnd>, CLO_FM<0x24>;
|
|||||||
def DCLO : CountLeading1<"dclo", GPR64Opnd>, CLO_FM<0x25>;
|
def DCLO : CountLeading1<"dclo", GPR64Opnd>, CLO_FM<0x25>;
|
||||||
|
|
||||||
/// Double Word Swap Bytes/HalfWords
|
/// Double Word Swap Bytes/HalfWords
|
||||||
def DSBH : SubwordSwap<"dsbh", GPR64Opnd>, SEB_FM<2, 0x24>;
|
def DSBH : SubwordSwap<"dsbh", GPR64Opnd>, SEB_FM<2, 0x24>, ISA_MIPS64R2;
|
||||||
def DSHD : SubwordSwap<"dshd", GPR64Opnd>, SEB_FM<5, 0x24>;
|
def DSHD : SubwordSwap<"dshd", GPR64Opnd>, SEB_FM<5, 0x24>, ISA_MIPS64R2;
|
||||||
|
|
||||||
def LEA_ADDiu64 : EffectiveAddress<"daddiu", GPR64Opnd>, LW_FM<0x19>;
|
def LEA_ADDiu64 : EffectiveAddress<"daddiu", GPR64Opnd>, LW_FM<0x19>;
|
||||||
|
|
||||||
|
@ -362,10 +362,10 @@ MipsTargetLowering::MipsTargetLowering(MipsTargetMachine &TM)
|
|||||||
setOperationAction(ISD::CTLZ, MVT::i64, Expand);
|
setOperationAction(ISD::CTLZ, MVT::i64, Expand);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Subtarget->hasSwap()) {
|
if (!Subtarget->hasMips32r2())
|
||||||
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
|
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
|
||||||
|
if (!Subtarget->hasMips64r2())
|
||||||
setOperationAction(ISD::BSWAP, MVT::i64, Expand);
|
setOperationAction(ISD::BSWAP, MVT::i64, Expand);
|
||||||
}
|
|
||||||
|
|
||||||
if (isGP64bit()) {
|
if (isGP64bit()) {
|
||||||
setLoadExtAction(ISD::SEXTLOAD, MVT::i32, Custom);
|
setLoadExtAction(ISD::SEXTLOAD, MVT::i32, Custom);
|
||||||
|
@ -150,8 +150,6 @@ def HasSEInReg : Predicate<"Subtarget.hasSEInReg()">,
|
|||||||
AssemblerPredicate<"FeatureSEInReg">;
|
AssemblerPredicate<"FeatureSEInReg">;
|
||||||
def HasBitCount : Predicate<"Subtarget.hasBitCount()">,
|
def HasBitCount : Predicate<"Subtarget.hasBitCount()">,
|
||||||
AssemblerPredicate<"FeatureBitCount">;
|
AssemblerPredicate<"FeatureBitCount">;
|
||||||
def HasSwap : Predicate<"Subtarget.hasSwap()">,
|
|
||||||
AssemblerPredicate<"FeatureSwap">;
|
|
||||||
def HasMips2 : Predicate<"Subtarget.hasMips2()">,
|
def HasMips2 : Predicate<"Subtarget.hasMips2()">,
|
||||||
AssemblerPredicate<"FeatureMips2">;
|
AssemblerPredicate<"FeatureMips2">;
|
||||||
def HasMips3_32 : Predicate<"Subtarget.hasMips3_32()">,
|
def HasMips3_32 : Predicate<"Subtarget.hasMips3_32()">,
|
||||||
@ -226,7 +224,6 @@ class INSN_MIPS4_32 { list<Predicate> InsnPredicates = [HasMips4_32]; }
|
|||||||
// The portions of MIPS-IV that were also added to MIPS32R2
|
// The portions of MIPS-IV that were also added to MIPS32R2
|
||||||
class INSN_MIPS4_32R2 { list<Predicate> InsnPredicates = [HasMips4_32r2]; }
|
class INSN_MIPS4_32R2 { list<Predicate> InsnPredicates = [HasMips4_32r2]; }
|
||||||
|
|
||||||
class INSN_SWAP { list<Predicate> InsnPredicates = [HasSwap]; }
|
|
||||||
class INSN_SEINREG { list<Predicate> InsnPredicates = [HasSEInReg]; }
|
class INSN_SEINREG { list<Predicate> InsnPredicates = [HasSEInReg]; }
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -848,7 +845,7 @@ class SignExtInReg<string opstr, ValueType vt, RegisterOperand RO,
|
|||||||
// Subword Swap
|
// Subword Swap
|
||||||
class SubwordSwap<string opstr, RegisterOperand RO>:
|
class SubwordSwap<string opstr, RegisterOperand RO>:
|
||||||
InstSE<(outs RO:$rd), (ins RO:$rt), !strconcat(opstr, "\t$rd, $rt"), [],
|
InstSE<(outs RO:$rd), (ins RO:$rt), !strconcat(opstr, "\t$rd, $rt"), [],
|
||||||
NoItinerary, FrmR, opstr>, INSN_SWAP {
|
NoItinerary, FrmR, opstr> {
|
||||||
let neverHasSideEffects = 1;
|
let neverHasSideEffects = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1176,7 +1173,7 @@ def CLZ : MMRel, CountLeading0<"clz", GPR32Opnd>, CLO_FM<0x20>;
|
|||||||
def CLO : MMRel, CountLeading1<"clo", GPR32Opnd>, CLO_FM<0x21>;
|
def CLO : MMRel, CountLeading1<"clo", GPR32Opnd>, CLO_FM<0x21>;
|
||||||
|
|
||||||
/// Word Swap Bytes Within Halfwords
|
/// Word Swap Bytes Within Halfwords
|
||||||
def WSBH : MMRel, SubwordSwap<"wsbh", GPR32Opnd>, SEB_FM<2, 0x20>;
|
def WSBH : MMRel, SubwordSwap<"wsbh", GPR32Opnd>, SEB_FM<2, 0x20>, ISA_MIPS32R2;
|
||||||
|
|
||||||
/// No operation.
|
/// No operation.
|
||||||
def NOP : PseudoSE<(outs), (ins), []>, PseudoInstExpansion<(SLL ZERO, ZERO, 0)>;
|
def NOP : PseudoSE<(outs), (ins), []>, PseudoInstExpansion<(SLL ZERO, ZERO, 0)>;
|
||||||
|
@ -81,12 +81,11 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
|
|||||||
MipsABI(UnknownABI), IsLittle(little), IsSingleFloat(false),
|
MipsABI(UnknownABI), IsLittle(little), IsSingleFloat(false),
|
||||||
IsFP64bit(false), IsNaN2008bit(false), IsGP64bit(false), HasVFPU(false),
|
IsFP64bit(false), IsNaN2008bit(false), IsGP64bit(false), HasVFPU(false),
|
||||||
HasCnMips(false), IsLinux(true), HasMips3_32(false), HasMips4_32(false),
|
HasCnMips(false), IsLinux(true), HasMips3_32(false), HasMips4_32(false),
|
||||||
HasMips4_32r2(false), HasSEInReg(false), HasSwap(false),
|
HasMips4_32r2(false), HasSEInReg(false), HasBitCount(false),
|
||||||
HasBitCount(false), InMips16Mode(false),
|
InMips16Mode(false), InMips16HardFloat(Mips16HardFloat),
|
||||||
InMips16HardFloat(Mips16HardFloat), InMicroMipsMode(false), HasDSP(false),
|
InMicroMipsMode(false), HasDSP(false), HasDSPR2(false),
|
||||||
HasDSPR2(false), AllowMixed16_32(Mixed16_32 | Mips_Os16), Os16(Mips_Os16),
|
AllowMixed16_32(Mixed16_32 | Mips_Os16), Os16(Mips_Os16), HasMSA(false),
|
||||||
HasMSA(false), RM(_RM), OverrideMode(NoOverride), TM(_TM),
|
RM(_RM), OverrideMode(NoOverride), TM(_TM), TargetTriple(TT) {
|
||||||
TargetTriple(TT) {
|
|
||||||
std::string CPUName = CPU;
|
std::string CPUName = CPU;
|
||||||
CPUName = selectMipsCPU(TT, CPUName);
|
CPUName = selectMipsCPU(TT, CPUName);
|
||||||
|
|
||||||
|
@ -91,9 +91,6 @@ protected:
|
|||||||
// HasSEInReg - SEB and SEH (signext in register) instructions.
|
// HasSEInReg - SEB and SEH (signext in register) instructions.
|
||||||
bool HasSEInReg;
|
bool HasSEInReg;
|
||||||
|
|
||||||
// HasSwap - Byte and half swap instructions.
|
|
||||||
bool HasSwap;
|
|
||||||
|
|
||||||
// HasBitCount - Count leading '1' and '0' bits.
|
// HasBitCount - Count leading '1' and '0' bits.
|
||||||
bool HasBitCount;
|
bool HasBitCount;
|
||||||
|
|
||||||
@ -215,7 +212,6 @@ public:
|
|||||||
|
|
||||||
/// Features related to the presence of specific instructions.
|
/// Features related to the presence of specific instructions.
|
||||||
bool hasSEInReg() const { return HasSEInReg; }
|
bool hasSEInReg() const { return HasSEInReg; }
|
||||||
bool hasSwap() const { return HasSwap; }
|
|
||||||
bool hasBitCount() const { return HasBitCount; }
|
bool hasBitCount() const { return HasBitCount; }
|
||||||
bool hasExtractInsert() const { return !inMips16Mode() && hasMips32r2(); }
|
bool hasExtractInsert() const { return !inMips16Mode() && hasMips32r2(); }
|
||||||
|
|
||||||
|
10
test/MC/Mips/mips32r2/invalid-mips64r2.s
Normal file
10
test/MC/Mips/mips32r2/invalid-mips64r2.s
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Instructions that are invalid
|
||||||
|
#
|
||||||
|
# RUN: not llvm-mc %s -triple=mips64-unknown-linux -show-encoding \
|
||||||
|
# RUN: -mcpu=mips32r2 2>%t1
|
||||||
|
# RUN: FileCheck %s < %t1
|
||||||
|
|
||||||
|
.set noat
|
||||||
|
dsbh $v1,$t6 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||||
|
dshd $v0,$sp # CHECK: :[[@LINE]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
|
||||||
|
|
Loading…
Reference in New Issue
Block a user