mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
[mips] [IAS] Add support for the .module softfloat/hardfloat directives.
These directives are used to set the default value of the SoftFloat feature. They have the same effect as setting -m{soft, hard}-float from the command line. Differential Revision: http://reviews.llvm.org/D9073 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241066 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dcec5265ae
commit
e143a3abc2
@ -4703,6 +4703,8 @@ bool MipsAsmParser::parseInsnDirective() {
|
||||
/// ::= .module oddspreg
|
||||
/// ::= .module nooddspreg
|
||||
/// ::= .module fp=value
|
||||
/// ::= .module softfloat
|
||||
/// ::= .module hardfloat
|
||||
bool MipsAsmParser::parseDirectiveModule() {
|
||||
MCAsmParser &Parser = getParser();
|
||||
MCAsmLexer &Lexer = getLexer();
|
||||
@ -4765,6 +4767,44 @@ bool MipsAsmParser::parseDirectiveModule() {
|
||||
return false; // parseDirectiveModule has finished successfully.
|
||||
} else if (Option == "fp") {
|
||||
return parseDirectiveModuleFP();
|
||||
} else if (Option == "softfloat") {
|
||||
setModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float");
|
||||
|
||||
// Synchronize the ABI Flags information with the FeatureBits information we
|
||||
// updated above.
|
||||
getTargetStreamer().updateABIInfo(*this);
|
||||
|
||||
// If printing assembly, use the recently updated ABI Flags information.
|
||||
// If generating ELF, don't do anything (the .MIPS.abiflags section gets
|
||||
// emitted later).
|
||||
getTargetStreamer().emitDirectiveModuleSoftFloat();
|
||||
|
||||
// If this is not the end of the statement, report an error.
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
reportParseError("unexpected token, expected end of statement");
|
||||
return false;
|
||||
}
|
||||
|
||||
return false; // parseDirectiveModule has finished successfully.
|
||||
} else if (Option == "hardfloat") {
|
||||
clearModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float");
|
||||
|
||||
// Synchronize the ABI Flags information with the FeatureBits information we
|
||||
// updated above.
|
||||
getTargetStreamer().updateABIInfo(*this);
|
||||
|
||||
// If printing assembly, use the recently updated ABI Flags information.
|
||||
// If generating ELF, don't do anything (the .MIPS.abiflags section gets
|
||||
// emitted later).
|
||||
getTargetStreamer().emitDirectiveModuleHardFloat();
|
||||
|
||||
// If this is not the end of the statement, report an error.
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
reportParseError("unexpected token, expected end of statement");
|
||||
return false;
|
||||
}
|
||||
|
||||
return false; // parseDirectiveModule has finished successfully.
|
||||
} else {
|
||||
return Error(L, "'" + Twine(Option) + "' is not a valid .module option.");
|
||||
}
|
||||
|
@ -99,6 +99,8 @@ void MipsTargetStreamer::emitDirectiveModuleOddSPReg() {
|
||||
if (!ABIFlagsSection.OddSPReg && !ABIFlagsSection.Is32BitABI)
|
||||
report_fatal_error("+nooddspreg is only valid for O32");
|
||||
}
|
||||
void MipsTargetStreamer::emitDirectiveModuleSoftFloat() {}
|
||||
void MipsTargetStreamer::emitDirectiveModuleHardFloat() {}
|
||||
void MipsTargetStreamer::emitDirectiveSetFp(
|
||||
MipsABIFlagsSection::FpABIKind Value) {
|
||||
forbidModuleDirective();
|
||||
@ -404,6 +406,14 @@ void MipsTargetAsmStreamer::emitDirectiveSetNoOddSPReg() {
|
||||
OS << "\t.set\tnooddspreg\n";
|
||||
}
|
||||
|
||||
void MipsTargetAsmStreamer::emitDirectiveModuleSoftFloat() {
|
||||
OS << "\t.module\tsoftfloat\n";
|
||||
}
|
||||
|
||||
void MipsTargetAsmStreamer::emitDirectiveModuleHardFloat() {
|
||||
OS << "\t.module\thardfloat\n";
|
||||
}
|
||||
|
||||
// This part is for ELF object output.
|
||||
MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S,
|
||||
const MCSubtargetInfo &STI)
|
||||
|
@ -83,6 +83,8 @@ public:
|
||||
// FP abiflags directives
|
||||
virtual void emitDirectiveModuleFP();
|
||||
virtual void emitDirectiveModuleOddSPReg();
|
||||
virtual void emitDirectiveModuleSoftFloat();
|
||||
virtual void emitDirectiveModuleHardFloat();
|
||||
virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value);
|
||||
virtual void emitDirectiveSetOddSPReg();
|
||||
virtual void emitDirectiveSetNoOddSPReg();
|
||||
@ -192,6 +194,8 @@ public:
|
||||
// FP abiflags directives
|
||||
void emitDirectiveModuleFP() override;
|
||||
void emitDirectiveModuleOddSPReg() override;
|
||||
void emitDirectiveModuleSoftFloat() override;
|
||||
void emitDirectiveModuleHardFloat() override;
|
||||
void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override;
|
||||
void emitDirectiveSetOddSPReg() override;
|
||||
void emitDirectiveSetNoOddSPReg() override;
|
||||
|
26
test/MC/Mips/module-hardfloat.s
Normal file
26
test/MC/Mips/module-hardfloat.s
Normal file
@ -0,0 +1,26 @@
|
||||
# RUN: llvm-mc %s -arch=mips -mcpu=mips32 | \
|
||||
# RUN: FileCheck %s -check-prefix=CHECK-ASM
|
||||
#
|
||||
# RUN: llvm-mc %s -arch=mips -mcpu=mips32 -filetype=obj -o - | \
|
||||
# RUN: llvm-readobj -mips-abi-flags - | \
|
||||
# RUN: FileCheck %s -check-prefix=CHECK-OBJ
|
||||
|
||||
# CHECK-ASM: .module hardfloat
|
||||
|
||||
# Check if the MIPS.abiflags section was correctly emitted:
|
||||
# CHECK-OBJ: MIPS ABI Flags {
|
||||
# CHECK-OBJ: FP ABI: Hard float (32-bit CPU, Any FPU) (0x5)
|
||||
# CHECK-OBJ: CPR1 size: 32
|
||||
# CHECK-OBJ: Flags 1 [ (0x1)
|
||||
# CHECK-OBJ: ODDSPREG (0x1)
|
||||
# CHECK-OBJ: ]
|
||||
# CHECK-OBJ: }
|
||||
|
||||
.module fp=xx
|
||||
.module oddspreg
|
||||
.module softfloat
|
||||
.module hardfloat
|
||||
|
||||
# FIXME: Test should include gnu_attributes directive when implemented.
|
||||
# An explicit .gnu_attribute must be checked against the effective
|
||||
# command line options and any inconsistencies reported via a warning.
|
20
test/MC/Mips/module-softfloat.s
Normal file
20
test/MC/Mips/module-softfloat.s
Normal file
@ -0,0 +1,20 @@
|
||||
# RUN: llvm-mc %s -arch=mips -mcpu=mips32 | \
|
||||
# RUN: FileCheck %s -check-prefix=CHECK-ASM
|
||||
#
|
||||
# RUN: llvm-mc %s -arch=mips -mcpu=mips32 -filetype=obj -o - | \
|
||||
# RUN: llvm-readobj -mips-abi-flags - | \
|
||||
# RUN: FileCheck %s -check-prefix=CHECK-OBJ
|
||||
|
||||
# CHECK-ASM: .module softfloat
|
||||
|
||||
# Check if the MIPS.abiflags section was correctly emitted:
|
||||
# CHECK-OBJ: MIPS ABI Flags {
|
||||
# CHECK-OBJ: FP ABI: Soft float (0x3)
|
||||
# CHECK-OBJ: CPR1 size: 0
|
||||
# CHECK-OBJ: }
|
||||
|
||||
.module softfloat
|
||||
|
||||
# FIXME: Test should include gnu_attributes directive when implemented.
|
||||
# An explicit .gnu_attribute must be checked against the effective
|
||||
# command line options and any inconsistencies reported via a warning.
|
Loading…
Reference in New Issue
Block a user