mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
This patch implements .set mips32r2 directive and sets appropriate feature bits. It also introduces helper functions that are used to set and clear feature bits as necessary. This directive is a counterpart of -mips32r2 command line options with the exception that it does not influence elf header flags. The usage example is gives in test file.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202807 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b62b44ccc5
commit
7650bc0fd2
@ -257,6 +257,20 @@ class MipsAsmParser : public MCTargetAsmParser {
|
|||||||
// Example: INSERT.B $w0[n], $1 => 16 > n >= 0
|
// Example: INSERT.B $w0[n], $1 => 16 > n >= 0
|
||||||
bool validateMSAIndex(int Val, int RegKind);
|
bool validateMSAIndex(int Val, int RegKind);
|
||||||
|
|
||||||
|
void setFeatureBits(unsigned Feature, StringRef FeatureString) {
|
||||||
|
if (!(STI.getFeatureBits() & Feature)) {
|
||||||
|
setAvailableFeatures(ComputeAvailableFeatures(
|
||||||
|
STI.ToggleFeature(FeatureString)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearFeatureBits(unsigned Feature, StringRef FeatureString) {
|
||||||
|
if (STI.getFeatureBits() & Feature) {
|
||||||
|
setAvailableFeatures(ComputeAvailableFeatures(
|
||||||
|
STI.ToggleFeature(FeatureString)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
|
MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
|
||||||
const MCInstrInfo &MII)
|
const MCInstrInfo &MII)
|
||||||
@ -2439,6 +2453,13 @@ bool MipsAsmParser::parseDirectiveSet() {
|
|||||||
getTargetStreamer().emitDirectiveSetMicroMips();
|
getTargetStreamer().emitDirectiveSetMicroMips();
|
||||||
Parser.eatToEndOfStatement();
|
Parser.eatToEndOfStatement();
|
||||||
return false;
|
return false;
|
||||||
|
} else if (Tok.getString() == "mips32r2") {
|
||||||
|
Parser.Lex(); // Eat token.
|
||||||
|
if (getLexer().isNot(AsmToken::EndOfStatement))
|
||||||
|
return reportParseError("unexpected token in .set directive");
|
||||||
|
setFeatureBits(Mips::FeatureMips32r2,"mips32r2");
|
||||||
|
getTargetStreamer().emitDirectiveSetMips32R2();
|
||||||
|
return false;
|
||||||
} else {
|
} else {
|
||||||
// It is just an identifier, look for an assignment.
|
// It is just an identifier, look for an assignment.
|
||||||
parseSetAssignment();
|
parseSetAssignment();
|
||||||
|
@ -97,6 +97,10 @@ void MipsTargetAsmStreamer::emitFrame(unsigned StackReg, unsigned StackSize,
|
|||||||
<< StringRef(MipsInstPrinter::getRegisterName(ReturnReg)).lower() << '\n';
|
<< StringRef(MipsInstPrinter::getRegisterName(ReturnReg)).lower() << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MipsTargetAsmStreamer::emitDirectiveSetMips32R2() {
|
||||||
|
OS << "\t.set\tmips32r2\n";
|
||||||
|
}
|
||||||
|
|
||||||
// Print a 32 bit hex number with all numbers.
|
// Print a 32 bit hex number with all numbers.
|
||||||
static void printHex32(unsigned Value, raw_ostream &OS) {
|
static void printHex32(unsigned Value, raw_ostream &OS) {
|
||||||
OS << "0x";
|
OS << "0x";
|
||||||
@ -302,3 +306,7 @@ void MipsTargetELFStreamer::emitFMask(unsigned FPUBitmask,
|
|||||||
int FPUTopSavedRegOff) {
|
int FPUTopSavedRegOff) {
|
||||||
// FIXME: implement.
|
// FIXME: implement.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MipsTargetELFStreamer::emitDirectiveSetMips32R2() {
|
||||||
|
// No action required for ELF output.
|
||||||
|
}
|
||||||
|
@ -39,6 +39,8 @@ public:
|
|||||||
unsigned ReturnReg) = 0;
|
unsigned ReturnReg) = 0;
|
||||||
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) = 0;
|
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) = 0;
|
||||||
virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) = 0;
|
virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) = 0;
|
||||||
|
|
||||||
|
virtual void emitDirectiveSetMips32R2() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// This part is for ascii assembly output
|
// This part is for ascii assembly output
|
||||||
@ -67,6 +69,8 @@ public:
|
|||||||
unsigned ReturnReg);
|
unsigned ReturnReg);
|
||||||
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
|
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
|
||||||
virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
|
virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
|
||||||
|
|
||||||
|
virtual void emitDirectiveSetMips32R2();
|
||||||
};
|
};
|
||||||
|
|
||||||
// This part is for ELF object output
|
// This part is for ELF object output
|
||||||
@ -102,6 +106,8 @@ public:
|
|||||||
unsigned ReturnReg);
|
unsigned ReturnReg);
|
||||||
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
|
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
|
||||||
virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
|
virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
|
||||||
|
|
||||||
|
virtual void emitDirectiveSetMips32R2();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# RUN: llvm-mc -show-encoding -triple mips-unknown-unknown %s | FileCheck %s
|
# RUN: llvm-mc -show-encoding -mcpu=mips32 -triple mips-unknown-unknown %s | FileCheck %s
|
||||||
#
|
#
|
||||||
# CHECK: .text
|
# CHECK: .text
|
||||||
# CHECK: $BB0_2:
|
# CHECK: $BB0_2:
|
||||||
@ -49,3 +49,12 @@ $BB0_4:
|
|||||||
# CHECK: # fixup A - offset: 0, value: ($tmp7)@ABS_HI, kind: fixup_Mips_HI16
|
# CHECK: # fixup A - offset: 0, value: ($tmp7)@ABS_HI, kind: fixup_Mips_HI16
|
||||||
abs.s f6,FPU_MASK
|
abs.s f6,FPU_MASK
|
||||||
lui $1, %hi($tmp7)
|
lui $1, %hi($tmp7)
|
||||||
|
|
||||||
|
# CHECK: .set mips32r2
|
||||||
|
# CHECK: ldxc1 $f0, $zero($5) # encoding: [0x4c,0xa0,0x00,0x01]
|
||||||
|
# CHECK: luxc1 $f0, $6($5) # encoding: [0x4c,0xa6,0x00,0x05]
|
||||||
|
# CHECK: lwxc1 $f6, $2($5) # encoding: [0x4c,0xa2,0x01,0x80]
|
||||||
|
.set mips32r2
|
||||||
|
ldxc1 $f0, $zero($5)
|
||||||
|
luxc1 $f0, $6($5)
|
||||||
|
lwxc1 $f6, $2($5)
|
||||||
|
Loading…
Reference in New Issue
Block a user